I have made a library in order to save directly in bmp the picture in the SD CARD.
bmp.h
#ifndef bmp_h
#define bmp_h
#include "Arduino.h"
class Bmp
{
public:
Bmp();
void init(unsigned int px, unsigned int py);
char bmpFileHeader[14];
char bmpInfoHeader[40];
unsigned int rowSize; // How many bytes in the row (used to create padding)
unsigned int fileSize; // Headers (54 bytes) + pixel data
int pad; // Max paddin needed will be 3 zeros
};
extern Bmp bmp;
#endif
bmp.cpp
#include "bmp.h"
Bmp::Bmp() {
bmpFileHeader = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
bmpInfoHeader = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
}
void Bmp::init(unsigned int px, unsigned int py){
rowSize = 4 * ((3*px + 3)/4);
fileSize = 54 + py*rowSize;
pad = rowSize-3*px; //Number of zeros needed;
bmpFileHeader[ 2] = (byte)(fileSize );
bmpFileHeader[ 3] = (byte)(fileSize >> 8);
bmpFileHeader[ 4] = (byte)(fileSize >> 16);
bmpFileHeader[ 5] = (byte)(fileSize >> 24);
bmpInfoHeader[ 4] = (byte)( px );
bmpInfoHeader[ 5] = (byte)( px >> 8);
bmpInfoHeader[ 6] = (byte)( px >> 16);
bmpInfoHeader[ 7] = (byte)( px >> 24);
bmpInfoHeader[ 8] = (byte)( py );
bmpInfoHeader[ 9] = (byte)( py >> 8);
bmpInfoHeader[10] = (byte)( py >> 16);
bmpInfoHeader[11] = (byte)( py >> 24);
}
Bmp bmp;
Then for instance, if working with rgb444 would be:
if (!sd.begin(CHIP_SELECT, SPI_HALF_SPEED)) sd.initErrorHalt();
if (!myFile.open(fileName, O_WRITE | O_CREAT ))
sd.errorHalt("opening file for write failed");
Serial.print("Writing to ");
Serial.print(fileName);
Serial.print("... ");
bmp.init(COLS,ROWS);
myFile.write(bmp.bmpFileHeader, sizeof(bmp.bmpFileHeader)); // Write file header
myFile.write(bmp.bmpInfoHeader, sizeof(bmp.bmpInfoHeader)); // Write info header
byte tmp[COLS*3]; //Row with RGB (3 bpp)
byte padding[bmp.pad];
for( int i=0; i< bmp.pad; i++)
padding[i]=0;
for (int y=0; y<ROWS; y++) {
for (int x=0; x<(COLS); x++) {
tmp[x*3+0] = (byte)((0x0F & buffer[2*y*COLS + 2*x])<<4); // R
tmp[x*3+1] = (byte)(0xF0 & buffer[2*y*COLS + 2*x+1]); // G
tmp[x*3+2] = (byte)((0x0F & buffer[2*y*COLS + 2*x+1]) <<4); // B
}
myFile.write(tmp, sizeof(tmp)); // Write tmp data
myFile.write(padding, sizeof(padding)); // Padding as needed
}
Serial.println("Done");
myFile.close();
I hope it would be helpfull for someone!


