This said, IFif your bitmap has a standard BITMAPINFOHEADERBITMAPINFOHEADER header, and IFif your bitmap has a 24 bit standard coding (16 millions of colors) you can do something like this:
int32_t readNbytesInt(File *p_file, int position, byte nBytes)
{
if (nBytes > 4)
return 0;
p_file->seek(position);
int32_t weight = 1;
int32_t result = 0;
for (; nBytes; nBytes--)
{
result += weight * p_file->read();
weight <<= 8;
}
return result;
}
void setup()
{
Serial.begin(9600);
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(53)) {
Serial.println("initialization failed!");
while (1); // <- this is how you should block execution, not with returns
}
Serial.println("initialization done.");
// Open
File bmpImage = SD.open("Circle.bmp", FILE_READ);
File textFile = SD.open("test.txt", FILE_WRITE);
int32_t dataStartingOffset = readNbytesInt(&bmpImage, 0x0A, 4);
// Change their types to int32_t (4byte)
int32_t width = readNbytesInt(&bmpImage, 0x12, 4);
int32_t height = readNbytesInt(&bmpImage, 0x16, 4);
Serial.println(width);
Serial.println(height);
int16_t pixelsize = readNbytesInt(&bmpImage, 0x1C, 2);
if (pixelsize != 24)
{
Serial.println("Image is not 24 bpp");
while (1);
}
bmpImage.seek(dataStartingOffset);//skip bitmap header
// 24bpp means you have three bytes per pixel, usually B G R
byte R, G, B;
for(int32_t i = 0; i < height; i ++) {
for (int32_t j = 0; j < width; j ++) {
B = bmpImage.read();
G = bmpImage.read();
R = bmpImage.read();
textFile.print("R");
textFile.print(R);
textFile.print("G");
textFile.print(G);
textFile.print("B");
textFile.print(B);
textFile.print(" ");
}
textFile.print("\n");
}
bmpImage.close();
textFile.close();
Serial.println("done write");
}
int32_t readNbytesInt(File *p_file, int position, byte nBytes)
{
if (nBytes > 4)
return 0;
p_file->seek(position);
int32_t weight = 1;
int32_t result = 0;
for (; nBytes; nBytes--)
{
result += weight * p_file->read();
weight <<= 8;
}
return result;
}
void setup()
{
Serial.begin(9600);
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(53)) {
Serial.println("initialization failed!");
while (1); // <- this is how you should block execution, not with returns
}
Serial.println("initialization done.");
// Open
File bmpImage = SD.open("Circle.bmp", FILE_READ);
File textFile = SD.open("test.txt", FILE_WRITE);
int32_t dataStartingOffset = readNbytesInt(&bmpImage, 0x0A, 4);
// Change their types to int32_t (4byte)
int32_t width = readNbytesInt(&bmpImage, 0x12, 4);
int32_t height = readNbytesInt(&bmpImage, 0x16, 4);
Serial.println(width);
Serial.println(height);
int16_t pixelsize = readNbytesInt(&bmpImage, 0x1C, 2);
if (pixelsize != 24)
{
Serial.println("Image is not 24 bpp");
while (1);
}
bmpImage.seek(dataStartingOffset);//skip bitmap header
// 24bpp means you have three bytes per pixel, usually B G R
byte R, G, B;
for(int32_t i = 0; i < height; i ++) {
for (int32_t j = 0; j < width; j ++) {
B = bmpImage.read();
G = bmpImage.read();
R = bmpImage.read();
textFile.print("R");
textFile.print(R);
textFile.print("G");
textFile.print(G);
textFile.print("B");
textFile.print(B);
textFile.print(" ");
}
textFile.print("\n");
}
bmpImage.close();
textFile.close();
Serial.println("done write");
}