读书人

求能把.dat转成BMP图像的程序解决方案

发布时间: 2012-04-22 18:34:46 作者: rapoo

求能把.dat转成BMP图像的程序
把一个.dat数据文件(存储着0到255的黑白数据)转为BMP图像的程序应该怎么写?
怎样添加BMP的头文件?

该操作是在单片机上进行的,开发环境,编译器也是纯嵌入式用的,可能有些函数不能调用

[解决办法]
先都把数据读出来,然后存到一个数组中

C/C++ code
CBitmap::CreateBitmap BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );
[解决办法]
如果你的图片格式 颜色都固定 那可以固定成一个Buffer块 写data前面就可以了
[解决办法]
问题是你的dat文件数据格式是怎么样的

如果和bmp一样的格式,那么读取后直接CreateBitmap也可
[解决办法]
我之前项目中编写过的一个代码,保存256色的图片。

C/C++ code
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图的字节映像作参考吧
C/C++ code
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值

读书人网 >C语言

热点推荐