mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Fix bmp file reading for all formats
This commit is contained in:
parent
ad4da07d70
commit
466a50a003
@ -33,7 +33,13 @@ bool bmp_read_geometry(FIL *fp, image_t *img, const char *path, bmp_read_setting
|
|||||||
uint32_t data_size = file_size - header_size;
|
uint32_t data_size = file_size - header_size;
|
||||||
if (data_size % 4) ff_file_corrupted(fp);
|
if (data_size % 4) ff_file_corrupted(fp);
|
||||||
|
|
||||||
read_long_expect(fp, 40);
|
uint32_t header_type;
|
||||||
|
read_long(fp, &header_type);
|
||||||
|
if ((header_type != 40) // BITMAPINFOHEADER
|
||||||
|
&& (header_type != 52) // BITMAPV2INFOHEADER
|
||||||
|
&& (header_type != 56) // BITMAPV3INFOHEADER
|
||||||
|
&& (header_type != 108) // BITMAPV4HEADER
|
||||||
|
&& (header_type != 124)) ff_unsupported_format(fp); // BITMAPV5HEADER
|
||||||
read_long(fp, (uint32_t*) &rs->bmp_w);
|
read_long(fp, (uint32_t*) &rs->bmp_w);
|
||||||
read_long(fp, (uint32_t*) &rs->bmp_h);
|
read_long(fp, (uint32_t*) &rs->bmp_h);
|
||||||
if ((rs->bmp_w == 0) || (rs->bmp_h == 0)) ff_file_corrupted(fp);
|
if ((rs->bmp_w == 0) || (rs->bmp_h == 0)) ff_file_corrupted(fp);
|
||||||
@ -56,6 +62,18 @@ bool bmp_read_geometry(FIL *fp, image_t *img, const char *path, bmp_read_setting
|
|||||||
|
|
||||||
if (rs->bmp_bpp == 8) {
|
if (rs->bmp_bpp == 8) {
|
||||||
if (rs->bmp_fmt != 0) ff_unsupported_format(fp);
|
if (rs->bmp_fmt != 0) ff_unsupported_format(fp);
|
||||||
|
if (header_type >= 52) { // Skip past the remaining BITMAPV2INFOHEADER bytes.
|
||||||
|
for (int i = 0; i < 3; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 56) { // Skip past the remaining BITMAPV3INFOHEADER bytes.
|
||||||
|
for (int i = 0; i < 1; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 108) { // Skip past the remaining BITMAPV4HEADER bytes.
|
||||||
|
for (int i = 0; i < 13; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 124) { // Skip past the remaining BITMAPV5HEADER bytes.
|
||||||
|
for (int i = 0; i < 4; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
// Color Table (1024 bytes)
|
// Color Table (1024 bytes)
|
||||||
for (int i = 0; i < 256; i++) {
|
for (int i = 0; i < 256; i++) {
|
||||||
read_long_expect(fp, ((i) << 16) | ((i) << 8) | i);
|
read_long_expect(fp, ((i) << 16) | ((i) << 8) | i);
|
||||||
@ -66,12 +84,32 @@ bool bmp_read_geometry(FIL *fp, image_t *img, const char *path, bmp_read_setting
|
|||||||
read_long_expect(fp, 0x1F << 11);
|
read_long_expect(fp, 0x1F << 11);
|
||||||
read_long_expect(fp, 0x3F << 5);
|
read_long_expect(fp, 0x3F << 5);
|
||||||
read_long_expect(fp, 0x1F);
|
read_long_expect(fp, 0x1F);
|
||||||
|
if (header_type >= 56) { // Skip past the remaining BITMAPV3INFOHEADER bytes.
|
||||||
|
for (int i = 0; i < 1; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 108) { // Skip past the remaining BITMAPV4HEADER bytes.
|
||||||
|
for (int i = 0; i < 13; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 124) { // Skip past the remaining BITMAPV5HEADER bytes.
|
||||||
|
for (int i = 0; i < 4; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
} else if (rs->bmp_bpp == 24) {
|
} else if (rs->bmp_bpp == 24) {
|
||||||
if (rs->bmp_fmt == 3) {
|
if (rs->bmp_fmt == 3) {
|
||||||
// Bit Masks (12 bytes)
|
// Bit Masks (12 bytes)
|
||||||
read_long_expect(fp, 0xFF << 16);
|
read_long_expect(fp, 0xFF << 16);
|
||||||
read_long_expect(fp, 0xFF << 8);
|
read_long_expect(fp, 0xFF << 8);
|
||||||
read_long_expect(fp, 0xFF);
|
read_long_expect(fp, 0xFF);
|
||||||
|
} else if (header_type >= 52) { // Skip past the remaining BITMAPV2INFOHEADER bytes.
|
||||||
|
for (int i = 0; i < 3; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 56) { // Skip past the remaining BITMAPV3INFOHEADER bytes.
|
||||||
|
for (int i = 0; i < 1; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 108) { // Skip past the remaining BITMAPV4HEADER bytes.
|
||||||
|
for (int i = 0; i < 13; i++) read_long_ignore(fp);
|
||||||
|
}
|
||||||
|
if (header_type >= 124) { // Skip past the remaining BITMAPV5HEADER bytes.
|
||||||
|
for (int i = 0; i < 4; i++) read_long_ignore(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user