Saving image from PropCam to a BMP-file on SD-card
banjo
Posts: 447
In Spin I'd like to save an acquired image form ProCam as a BMP-file to a SD-card.
So far I've accomplished to save data to a file with the 'SD-MMC_FATEngine' object.
What I'd need some help with now is the BMP-header for the image file. The relevant code I've tried with is below but that is not resulting in a functional BMP-file. By using a HEX-editor and copying from another 4-bit file I've been able to turn the PropCam image into a functional BMP-file but the grayscales are incorrect.
A few questions:
1) With a grayscale image, do I need a color table in the header? In that case, what color table to use for PropCam?
2) After I have a correct header, do I need to pad the file in the end so the total file size would be a factor of e.g. 16?
3) Anything else I'm misunderstanding or should think of? This is my first dive into Spin so still learning...
So far I've accomplished to save data to a file with the 'SD-MMC_FATEngine' object.
What I'd need some help with now is the BMP-header for the image file. The relevant code I've tried with is below but that is not resulting in a functional BMP-file. By using a HEX-editor and copying from another 4-bit file I've been able to turn the PropCam image into a functional BMP-file but the grayscales are incorrect.
A few questions:
1) With a grayscale image, do I need a color table in the header? In that case, what color table to use for PropCam?
2) After I have a correct header, do I need to pad the file in the end so the total file size would be a factor of e.g. 16?
3) Anything else I'm misunderstanding or should think of? This is my first dive into Spin so still learning...
PRI monitor(gray_buf_addr, hold_addr) | ch, text fat0.fatEngineStart( _dopin, _clkpin, _dipin, _cspin, _wppin, _cdpin, { } _rtcres1, _rtcres2, _rtcres3) fat0.mountPartition(0) fat0.deleteEntry(string("Image2.bmp")) fat0.newFile(string("Image2.bmp")) fat0.openFile(string("Image2.bmp"), "W") 'First, write the header biWidth:=128 biHeight:=96 biWidth*biHeight*3*4+54 fat0.writeData(@bfType,2) fat0.writeData(@bfSize,4) fat0.writeData(@bfReserved1,2) fat0.writeData(@bfReserved2,2) fat0.writeData(@bfOffBits,4) fat0.writeData(@biSize,4) fat0.writeData(@biWidth,4) fat0.writeData(@biHeight,4) fat0.writeData(@biPlanes,2) fat0.writeData(@biBitCount,2) fat0.writeData(@biCompression,4) fat0.writeData(@biSizeImage,4) fat0.writeData(@biXPelsPerMeter,4) fat0.writeData(@biYPelsPerMeter,4) fat0.writeData(@biClrUsed,4) fat0.writeData(@biClrImportant,4) 'Writing pixel data to file repeat ch from 4 to 6147 fat0.writeByte(byte[gray_buf_addr][ch]) fat0.unmountPartition waitcnt(clkfreq + cnt) statusLED(4) ' Make the status LED blink quickly. fat0.fatEngineStop ' Give the block driver a second to finish up. '' This is the original code that is sending the image to a browser session initiated with PropCam_server.exe sio.start(31, 30, 0, 115200) repeat if ((ch := sio.rxcheck) => 0) if (ch == "I") sio.str(string("PropCAM")) elseif (ch == "S") if (hold_addr) byte[hold_addr]~~ repeat ch from 4 to 6147 sio.tx(byte[gray_buf_addr][ch]) if (hold_addr) byte[hold_addr]~ DAT BMPHeader 'Mostly using info from here: http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html bfType byte "B","M" ' 19778 bfSize long 0 bfReserved1 word 0 bfReserved2 word 0 bfOffBits long 54 biSize long 40 biWidth long 0 biHeight long 0 biPlanes word 1 biBitCount word 4 biCompression long 0 biSizeImage long 0 biXPelsPerMeter long 0 biYPelsPerMeter long 0 biClrUsed long 0 biClrImportant long 0
Comments
-Phil
Thx, I'm trying to understand this but not really getting it all
With the 4-bit 128x96 image, is PIXELS_PER_ROW then 96? What about ROWS_PER_FRAME?
ROWS_PER_FRAME= 96
BITS_PER_PIXEL = 4 or 6, depending upon which driver you're using.
-Phil
Great that this is also supporting 6 bit images if I'd like to have more gray scale values
I was however able to hard code header data so now I'm at least able to save a BMP-file to the SD-card. The resolution however seems to be lower than in the PropWebcam_demo so I need to check my header once again.