求能把.dat转成BMP图像的程序
把一个.dat数据文件(存储着0到255的黑白数据)转为BMP图像的程序应该怎么写?
怎样添加BMP的头文件?
该操作是在单片机上进行的,开发环境,编译器也是纯嵌入式用的,可能有些函数不能调用
[解决办法]
先都把数据读出来,然后存到一个数组中
CBitmap::CreateBitmap BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );
[解决办法]
如果你的图片格式 颜色都固定 那可以固定成一个Buffer块 写data前面就可以了
[解决办法]
问题是你的dat文件数据格式是怎么样的
如果和bmp一样的格式,那么读取后直接CreateBitmap也可
[解决办法]
我之前项目中编写过的一个代码,保存256色的图片。
FILE *fp = fopen("D:\\test.bmp", "wb");if(fp != NULL){ saveBMP256c(fBase, fWidth, fHeight, fp); fclose(fp);}void saveBMP256c(const uint8* image, int width, int height, FILE *fp){ // 256 color bitmap header static unsigned char BitmapHeader[] = { 0x42, 0x4D, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, // 2 AA->FileSize 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, // 18 BB->Width 0xCC, 0xCC, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, // 22 CC->Height 0x00, 0x00, 0xDD, 0xDD, 0xDD, 0xDD, 0x00, 0x00, // 34 DD->ImageSize 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; int i, w, h; // getting pixels and dimensions const unsigned char* data = image; const int widthbyte = (width * 8 + 31) / 32 * 4; const int imagesize = widthbyte * height; const int palettesize = 256 * 4; const int filesize = sizeof(BitmapHeader) + palettesize + imagesize; *((int *)(BitmapHeader + 2)) = filesize; *((int *)(BitmapHeader + 18)) = width; *((int *)(BitmapHeader + 22)) = height; *((int *)(BitmapHeader + 34)) = imagesize; fseek(fp, 0L, SEEK_SET); // bitmap header fwrite(BitmapHeader, sizeof(BitmapHeader), 1L, fp); // palette for(i = 0; i < 256; i++) { fputc(i, fp); fputc(i, fp); fputc(i, fp); fputc(0, fp); } // 指到最下面一行数据 i = width * (height - 1); for(h = 0; h < height; h++) { for(w = 0; w < width; w++) { fputc(data[i], fp); i++; } // 补齐空字节,使得图像数据按四字节对齐 for(w = 0; w < widthbyte - width; w++) { fputc(0, fp); } // 指到上一行图像数据 i -= 2 * width; }}
[解决办法]
给你一个我用PhotoShop生成的128x128像素256级灰度BMP图的字节映像作参考吧
000000: 42 4D 38 44 00 00 00 00 00 00 36 04 00 00 28 00000010: 00 00 80 00 00 00 80 00 00 00 01 00 08 00 00 00000020: 00 00 00 00 00 00 12 0B 00 00 12 0B 00 00 00 00000030: 00 00 00 00 00 00 00 00 00 00 01 01 01 00 02 02000040: 02 00 03 03 03 00 04 04 04 00 05 05 05 00 06 06000050: 06 00 07 07 07 00 08 08 08 00 09 09 09 00 0A 0A000060: 0A 00 0B 0B 0B 00 0C 0C 0C 00 0D 0D 0D 00 0E 0E000070: 0E 00 0F 0F 0F 00 10 10 10 00 11 11 11 00 12 12000080: 12 00 13 13 13 00 14 14 14 00 15 15 15 00 16 16000090: 16 00 17 17 17 00 18 18 18 00 19 19 19 00 1A 1A0000A0: 1A 00 1B 1B 1B 00 1C 1C 1C 00 1D 1D 1D 00 1E 1E0000B0: 1E 00 1F 1F 1F 00 20 20 20 00 21 21 21 00 22 220000C0: 22 00 23 23 23 00 24 24 24 00 25 25 25 00 26 260000D0: 26 00 27 27 27 00 28 28 28 00 29 29 29 00 2A 2A0000E0: 2A 00 2B 2B 2B 00 2C 2C 2C 00 2D 2D 2D 00 2E 2E0000F0: 2E 00 2F 2F 2F 00 30 30 30 00 31 31 31 00 32 32000100: 32 00 33 33 33 00 34 34 34 00 35 35 35 00 36 36000110: 36 00 37 37 37 00 38 38 38 00 39 39 39 00 3A 3A000120: 3A 00 3B 3B 3B 00 3C 3C 3C 00 3D 3D 3D 00 3E 3E000130: 3E 00 3F 3F 3F 00 40 40 40 00 41 41 41 00 42 42000140: 42 00 43 43 43 00 44 44 44 00 45 45 45 00 46 46000150: 46 00 47 47 47 00 48 48 48 00 49 49 49 00 4A 4A000160: 4A 00 4B 4B 4B 00 4C 4C 4C 00 4D 4D 4D 00 4E 4E000170: 4E 00 4F 4F 4F 00 50 50 50 00 51 51 51 00 52 52000180: 52 00 53 53 53 00 54 54 54 00 55 55 55 00 56 56000190: 56 00 57 57 57 00 58 58 58 00 59 59 59 00 5A 5A0001A0: 5A 00 5B 5B 5B 00 5C 5C 5C 00 5D 5D 5D 00 5E 5E0001B0: 5E 00 5F 5F 5F 00 60 60 60 00 61 61 61 00 62 620001C0: 62 00 63 63 63 00 64 64 64 00 65 65 65 00 66 660001D0: 66 00 67 67 67 00 68 68 68 00 69 69 69 00 6A 6A0001E0: 6A 00 6B 6B 6B 00 6C 6C 6C 00 6D 6D 6D 00 6E 6E0001F0: 6E 00 6F 6F 6F 00 70 70 70 00 71 71 71 00 72 72000200: 72 00 73 73 73 00 74 74 74 00 75 75 75 00 76 76000210: 76 00 77 77 77 00 78 78 78 00 79 79 79 00 7A 7A000220: 7A 00 7B 7B 7B 00 7C 7C 7C 00 7D 7D 7D 00 7E 7E000230: 7E 00 7F 7F 7F 00 80 80 80 00 81 81 81 00 82 82000240: 82 00 83 83 83 00 84 84 84 00 85 85 85 00 86 86000250: 86 00 87 87 87 00 88 88 88 00 89 89 89 00 8A 8A000260: 8A 00 8B 8B 8B 00 8C 8C 8C 00 8D 8D 8D 00 8E 8E000270: 8E 00 8F 8F 8F 00 90 90 90 00 91 91 91 00 92 92000280: 92 00 93 93 93 00 94 94 94 00 95 95 95 00 96 96000290: 96 00 97 97 97 00 98 98 98 00 99 99 99 00 9A 9A0002A0: 9A 00 9B 9B 9B 00 9C 9C 9C 00 9D 9D 9D 00 9E 9E0002B0: 9E 00 9F 9F 9F 00 A0 A0 A0 00 A1 A1 A1 00 A2 A20002C0: A2 00 A3 A3 A3 00 A4 A4 A4 00 A5 A5 A5 00 A6 A60002D0: A6 00 A7 A7 A7 00 A8 A8 A8 00 A9 A9 A9 00 AA AA0002E0: AA 00 AB AB AB 00 AC AC AC 00 AD AD AD 00 AE AE0002F0: AE 00 AF AF AF 00 B0 B0 B0 00 B1 B1 B1 00 B2 B2000300: B2 00 B3 B3 B3 00 B4 B4 B4 00 B5 B5 B5 00 B6 B6000310: B6 00 B7 B7 B7 00 B8 B8 B8 00 B9 B9 B9 00 BA BA000320: BA 00 BB BB BB 00 BC BC BC 00 BD BD BD 00 BE BE000330: BE 00 BF BF BF 00 C0 C0 C0 00 C1 C1 C1 00 C2 C2000340: C2 00 C3 C3 C3 00 C4 C4 C4 00 C5 C5 C5 00 C6 C6000350: C6 00 C7 C7 C7 00 C8 C8 C8 00 C9 C9 C9 00 CA CA000360: CA 00 CB CB CB 00 CC CC CC 00 CD CD CD 00 CE CE000370: CE 00 CF CF CF 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2000380: D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6000390: D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA0003A0: DA 00 DB DB DB 00 DC DC DC 00 DD DD DD 00 DE DE0003B0: DE 00 DF DF DF 00 E0 E0 E0 00 E1 E1 E1 00 E2 E20003C0: E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E60003D0: E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA0003E0: EA 00 EB EB EB 00 EC EC EC 00 ED ED ED 00 EE EE0003F0: EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1 F1 00 F2 F2000400: F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6000410: F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9 F9 00 FA FA000420: FA 00 FB FB FB 00 FC FC FC 00 FD FD FD 00 FE FE000430: FE 00 FF FF FF 00 FF FF FF FF FF FF FF FF FF FF000440: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF...004420: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF004430: FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00
[解决办法]
因为图片是白色,所以其数据都是FF
偏移量0x436~0x4435共0x4000即16384==128*128个字节
[解决办法]
偏移量0x36~0x435共0x400个字节是0x00 0x00 0x00 0x00~0xFF 0xFF 0xFF 0x00代表256种调色板的RGBA值