Save Bitmap (.BMP)

BlitzMax Forums/BlitzMax Beginners Area/Save Bitmap (.BMP)

Looking through the help files, I couldn't see a command that acts like SaveBitmap. Does one exist?

The closest I could find were SavePixMapPNG and SavePixMapJPEG, but there doesn't appear to be saving for bitmap images.

Have i missed it somewhere?

There's not built in support, but you can use this module by Brucey:
http://www.brucey.net/programming/blitz/#bahfreeimage

Cheers Perturbatio (and of course brucey for creating it in the first place :))

Filax posted some code a while back

Unfortunately that code no longer works with BMax - the "image.masks[0]" bit causes BMax some kerfuffle.

:(

Thanks anyway, I might be able to salvage something from it though...

That's mentioned in the link :
You should use LockImage(image) to get the pixmap these days.

Anyway, does this do it :
imageload$ = "max.bmp"
imagesave$ = "max_new.bmp"

Graphics 640, 480, 0

AutoMidHandle True

img = LoadImage(imageload$)

DrawImage img, 319, 239
Flip
WaitKey()

SaveImage img, imagesave$

End


' BMP save stuff blatantly stolen from Simon Armstrong's BPaint example.
Function SaveImage(image:TImage,filename$)
	Local stream:TStream
	
	stream=WriteStream(filename)
	
	If stream
		WriteBMP stream,LockImage(image)
		CloseStream stream
	EndIf
End Function

Function WriteBMP( stream:TStream,pixmap:TPixmap )
	Local	buf:Byte[1024]
	Local	hsize,hoffset
	Local	size,width,height
	Local	planes,bits,compression,isize,xpels,ypels,cols,inuse
	Local	w,y
	
	width=pixmap.width
	height=pixmap.height
	w=width*3
	w=(w+3)&$fffc
	hsize=w*height+54
	size=40
	hoffset=54
	planes=1
	bits=24
	compression=0
	isize=40
	xpels=2834
	ypels=2834
	cols=0
	inuse=0
	stream=LittleEndianStream( stream )
	WriteByte stream,Asc("B")
	WriteByte stream,Asc("M")
	WriteInt stream,hsize
	WriteInt stream,0
	WriteInt stream,hoffset
	WriteInt stream,size
	WriteInt stream,width
	WriteInt stream,height
	WriteShort stream,planes
	WriteShort stream,bits
	WriteInt stream,compression
	WriteInt stream,isize
	WriteInt stream,xpels
	WriteInt stream,ypels
	WriteInt stream,cols
	WriteInt stream,inuse	
	buf=New Byte[w]
	For y=height-1 To 0 Step -1
		ConvertPixels(pixmap.pixelptr(0,y),pixmap.format,buf,PF_BGR888,width)
		stream.WriteBytes(buf,w)		
	Next
End Function

Function CopyImage:TImage( src:TImage,x,y,width,height )
	Local image:TImage
	Local srcpix:TPixmap,destpix:TPixmap
	Local format,i		

	srcpix=LockImage(src)
	format=srcpix.format
	destpix=CreatePixmap(width,height,format)	
	For i=0 Until height
		CopyPixels srcpix.PixelPtr(x,y+i),destpix.PixelPtr(0,i),format,width
	Next
	image=LoadImage(destpix)		
	Return image
End Function


That does indeed, do it.

Many thanks, TonyG :)