bah.freeimage and SavePixmapPng

BlitzMax Forums/Brucey's Modules/bah.freeimage and SavePixmapPng

BLaBZ(Posted 2015) [#1]
Brucey once again wanted to thank you for all the excellent work you've been doing! Without which my project would be seriously lacking.

I seem to have discovered a bug with bah.freeimage and the SavePixmapPNG command.

The following doesn't seem to work -

SuperStrict


Framework brl.pixmap
Import BRL.PNGLoader
Import bah.freeimage


Local pix:TPixmap = CreatePixmap(300,300,PF_RGBA8888)

ClearPixels(pix,GenRgb(0,0,255))

SavePixmapPNG(pix,"pixmaptest.png",0)

Function GenRgb:Int(red:Int, green:Int, blue:Int, alpha:Int = 255)
	Local RGB:Int = (Alpha Shl 24) | (Red Shl 16) | (Green Shl 8) | Blue
	Return RGB
End Function


It's crashing at this line -
Function SavePixmapPNG( pixmap:TPixmap,url:Object,compression=5 )

	compression=Min( Max( compression,0 ),9 )

	png_stream:TStream=WriteStream( url )
	If Not png_stream Return
	
	Try
		Local png_ptr=png_create_write_struct( "1.2.12",Null,Null,Null )<--***CRASH***


Unfortunately my limited c++ knowledge is keeping me from being able to debug the code. :/


rs22(Posted 2015) [#2]
If I remember correctly, bah.freeimage clashes with the default image handlers, so it should be used by itself only. You can save images with bah.freeimage:
SuperStrict

Framework brl.pixmap
Import bah.freeimage

Local pix:TPixmap = CreatePixmap(300,300,PF_RGBA8888)

ClearPixels(pix,GenRgb(0,0,255))

Local img:TFreeImage = TFreeImage.CreateFromPixmap(pix)
img.save("pixmaptest.png",FIF_PNG)

Function GenRgb:Int(red:Int, green:Int, blue:Int, alpha:Int = 255)
	Local RGB:Int = (Alpha Shl 24) | (Red Shl 16) | (Green Shl 8) | Blue
	Return RGB
End Function



Brucey(Posted 2015) [#3]
Like what rs232 said :-)

FreeImage has a plethora of image tools, including saving. If you are using the module, you may as well use them too!


BLaBZ(Posted 2015) [#4]
This is great! Thanks for the help!

Except freeImage seems to be reversing the R and B components. Even overwriting the format field doesn't seem to help.

SuperStrict

Framework brl.pixmap
Import bah.freeimage

Local pix:TPixmap = CreatePixmap(300,300,PF_RGBA8888)
ClearPixels(pix,GenRgb(0,0,255))
pix.format = PF_BGRA8888

Local img:TFreeImage = TFreeImage.CreateFromPixmap(pix)
'img.ConvertToType(FIT_RGBAF)
img.save("pixmaptest.png",FIF_PNG)

Function GenRgb:Int(red:Int, green:Int, blue:Int, alpha:Int = 255)
	Local RGB:Int = (Alpha Shl 24) | (Red Shl 16) | (Green Shl 8) | Blue
	Return RGB
End Function



I wrote a function to swap them to get by -
SuperStrict

Framework brl.pixmap
Import bah.freeimage

Local pix:TPixmap = CreatePixmap(300,300,PF_RGBA8888)
ConvertPixmap(pix,PF_BGRA8888)

ClearPixels(pix,GenRgb(0,0,255))

pix = SwapPixmapRB(pix)


Local img:TFreeImage = TFreeImage.CreateFromPixmap(pix)
'img.ConvertToType(FIT_RGBAF)
img.save("pixmaptest.png",FIF_PNG)

Function GenRgb:Int(red:Int, green:Int, blue:Int, alpha:Int = 255)
	Local RGB:Int = (Alpha Shl 24) | (Red Shl 16) | (Green Shl 8) | Blue
	Return RGB
End Function

Function SwapPixmapRB:TPixmap(Pixmap:TPixmap)
	Local px:TPixmap = CopyPixmap(Pixmap)
	
	For Local x:Int = 0 Until px.width
		For Local y:Int = 0 Until px.height
			Local pxl:Int = ReadPixel(Pixmap,x,y)
			WritePixel(px,x,y,GenRGB(ARGB_B(pxl),ARGB_G(pxl),ARGB_R(pxl)))
		Next
	Next

	Return px
End Function

Function ARGB_R:Int(r:Int)
	Return (r Shr 16) & $FF
End Function

Function ARGB_G:Int(g:Int)
	Return (g Shr 8) & $FF
End Function

Function ARGB_B:Int(b:Int)
	Return b & $FF
End Function



Pete Rigz(Posted 2015) [#5]
Regarding the R and B being swapped round, I had a similar problem but it only seems to affect windows, Mac seemd ok. I did something like:

?Win32
anim = anim.Convert(PF_BGRA8888)
?
Local freeimage:TFreeImage = TFreeImage.CreateFromPixmap(anim)
freeimage.save(tempfilename, FIF_PNG)


Which seemed to sort it.