在C ++中,我试图创建一个有效的.bmp输出文件

时间:2018-04-07 20:38:51

标签: c++ bitmap ofstream

我正在尝试复制这里找到的bmp:https://en.wikipedia.org/wiki/BMP_file_format(它的2x2)。每当我尝试在油漆或photoviewer中打开它或它所说的任何东西都不受支持。我不确定我在这里做错了什么。我已经多次查看十六进制值,并且所有内容(据我所知)看起来都相同。帮助

   #include <iostream>
    #include <fstream>
    using namespace std;

    int main(){
        ofstream bitmap;
        unsigned char bm_header[14] = 
        /*BM*/            { 0x4D, 0x42, 
        /*70 bytes*/        0x00, 0x00, 0x00, 0x46, 
        /*Unused */         0x00, 0x00, 0x00, 0x00, 
        /* 54 bytes */      0x00, 0x00, 0x00, 0x36 };

        unsigned char dib_header[40] = 
        /*40 bytes*/      { 0x00, 0x00, 0x00, 0x28,
        /*2 pixels wide*/   0x00, 0x00, 0x00, 0x02,
        /*2 pixels tall*/   0x00, 0x00, 0x00, 0x02,
        /*1 plane */        0x00, 0x01,
        /*24 bits */        0x00, 0x18,
        /*0 */              0x00, 0x00, 0x00, 0x00,
        /*16 bytes */       0x00, 0x00, 0x00, 0x10,
        /*2835 p/m wide*/   0x00, 0x00, 0x0B, 0x13,
        /*2835 p/m tall*/   0x00, 0x00, 0x0B, 0x13,
        /*0 colors*/        0x00, 0x00, 0x00, 0x00,
        /*0 import. colors*/0x00, 0x00, 0x00, 0x00 };

        unsigned char pixel_header[16] =
        {0x00, 0x00, 0xFF, 
         0xFF, 0xFF, 0xFF, 
         0x00, 0x00, 
         0x00, 0x00, 0xFF,
         0x00, 0xFF, 0x00, 
         0x00, 0x00 };

        bitmap.open("mandelbrot_1.bmp", ios::out | ios::binary);
        for(int i = 0; i < 14; i++) {
            bitmap << bm_header[i];
        }
        for(int i = 0; i < 40; i++) {
            bitmap << dib_header[i];
        }
        for(int i = 0; i < 16; i++) {
            bitmap << pixel_header[i];
        }
        cout << "success!" << endl;
        bitmap.close();
        return 0;

}

3 个答案:

答案 0 :(得分:1)

bm_headerdib_header中的每个字段都与其应有的字段相反。值0x4d,0x42拼写为“MB”,而不是“BM”。序列0x00,0x00,0x00,0x46被解释为0x46000000字节,而不是0x46字节。通常,Wikipedia表中的字节按它们应该进入文件的顺序列出。

答案 1 :(得分:1)

访问YouTube并搜索手工制作的英雄位图,或者使用手工英雄的频道观看36到39集。

凯西(作者)从理论上和实践中逐渐了解了所有你需要知道的东西,直到结尾的怪癖和结构紧密的包装。

这些剧集很容易自己消费,即使你对这个系列没有兴趣或者没看过之前的剧集。

答案 2 :(得分:0)

我建议您在线搜索BITMAPINFOHEADER。这将为您提供一个可以使用的结构,而不是直接操作字节。