Image Padder

BlitzMax Forums/BlitzMax Programming/Image Padder

therevills(Posted 2011) [#1]
I could'nt find a program which would open up a sprite sheet, pad the frames and then resave the image - so I coded one:

' Image Padder

SuperStrict

' the number of pixels you want around your image (ie the border)
Const PADDING:Int = 4

' the width and height of the each frame
Const WIDTH:Int = 110
Const HEIGHT:Int = 160

' number of frames in the file
Const FRAMES:Int = 4


Local filter$="Image Files:png; All Files:*"
Local testfile$ = RequestFile("Select File...", filter, False, CurrentDir());

If testfile = "" Then 
	Notify "No source Image selected... ", True
	RuntimeError "No source Image selected... "
Else
	Print "Loading.... "+testfile
	Local image:TImage = LoadAnimImage(testfile, WIDTH, HEIGHT, 0, FRAMES)
	Local piximage:TPixmap = LoadPixmap(testfile)
	If image = Null
		Print "Error loading image..."+testfile
	Else
		Print "Processing..."
		Local array%[WIDTH, HEIGHT]
		Local currentFrame% = 0
		Local tmp:TPixmap=CreatePixmap:TPixmap(WIDTH*FRAMES + (PADDING*2*FRAMES), HEIGHT + (PADDING*2), PixmapFormat(piximage))
		
		While currentFrame < FRAMES
			Print "Processing Frame = "+currentFrame
			
			Local tmpImage:TPixmap = LockImage(image, currentFrame)

			' store the pixels into an array					
			For Local x% = 0 To WIDTH - 1
				For Local y% = 0 To HEIGHT -1	
					Local argb:Int=ReadPixel(tmpImage, x, y)
					array[x, y] = argb
				Next
			Next
			
			' write the pixel
			Local argb%
			Local startX% = currentFrame * (WIDTH + (PADDING*2))
			Local startY% = 0
			For Local x% = startX To WIDTH + (PADDING * 2) + startX - 1
				For Local y% = startY To HEIGHT + (PADDING * 2) + startY - 1
					argb = $000000
					If x >= startX + PADDING And x < startX + WIDTH + PADDING And y >= startY + PADDING And y < startY + HEIGHT + PADDING
						argb = array[x - startX - PADDING, y - startY - PADDING]
					EndIf
					WritePixel(tmp, x, y, argb)
				Next
			Next
		
			currentFrame = currentFrame + 1
		Wend
		
		' save the image
		Local file:String = testfile + "_new"
		Print "Saving.... " + file
		If file > "" SavePixmapPNG(tmp, file, 9)
	EndIf
EndIf

Print ""
Print "Finished..."
End


Of course this could be a lot better with a GUI, but meh ;)


col(Posted 2011) [#2]
Oh go on.....make the GUI :D


jsp(Posted 2011) [#3]
I am working between the days, but I can do a little one tomorrow after work.


jsp(Posted 2011) [#4]
Ok, here is a first version:

There are two different ways to work. Either load an image and do your settings and hit create, or drop a file onto the window and get a new image create without any extra clicks. Of course you can set the padding before.
The window is resizable and will show the loaded image and if you manipulate any value it will show the output, but only as pixmap in a panel. I thought that should be enough for such a thing.
The values you enter will be checked if they do fit and if not the textfield will turn red to indicate the problematic value.
The Statusbar shows some feedback.
I have only tried with little strips where the on the fly update of the image is not a problem, if it may is for large images I could add a switch for it.
If someone has an icon image I could add it, but I am very bad doing icons...



Little Update: A wait cursor is now shown during processing and the padding value is checked as well.

Last edited 2011


therevills(Posted 2011) [#5]
Very nice jsp! Good job!


col(Posted 2011) [#6]
nice one jsp :)

cheers!


jsp(Posted 2011) [#7]
Thanks guys!
Let me know if you need any changes.