BMP 导出器不工作 C++

Posted

技术标签:

【中文标题】BMP 导出器不工作 C++【英文标题】:BMP Exporter not working C++ 【发布时间】:2015-04-03 17:14:07 【问题描述】:

因此,正如标题所述,我无法使用 C++ 导出 .bmp(24 位 bmp)。我正在将其作为学校项目类型的事情来做,我需要一些帮助。为了了解 .BMP 的工作原理,我查看了***页面,并从 here 获得了一些帮助,但我仍然无法弄清楚。这是我所拥有的:

//Export the map as a .bmp
void PixelMap::exportMap(const char* fileName)

    //Size of the file in bytes
    int fileSize = 54 + (3 * width * height);

    //The sections of the file
    unsigned char generalHeader[14] = 'B','M',0,0, 0,0,0,0, 0,0,54,0, 0,0;
    unsigned char DIBHeader[40]     = 40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,24,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0;
    unsigned char pixelArray[]      = "";

    //Set the binary portion of the generalHeader, mainly just file size
    generalHeader[2] = (unsigned char)(fileSize);
    generalHeader[3] = (unsigned char)(fileSize << 8);
    generalHeader[4] = (unsigned char)(fileSize << 16);
    generalHeader[5] = (unsigned char)(fileSize << 24);

    //The binary variable portion of the DIB header
    DIBHeader[4]  = (unsigned char)(width);
    DIBHeader[5]  = (unsigned char)(width << 8);
    DIBHeader[6]  = (unsigned char)(width << 16);
    DIBHeader[7]  = (unsigned char)(width << 24);
    DIBHeader[8]  = (unsigned char)(height);
    DIBHeader[9]  = (unsigned char)(height << 8);
    DIBHeader[10] = (unsigned char)(height << 16);
    DIBHeader[11] = (unsigned char)(height << 24);
    int picSize = 3 * width * height;
    DIBHeader[20] = (unsigned char)(picSize);
    DIBHeader[21] = (unsigned char)(picSize << 8);
    DIBHeader[22] = (unsigned char)(picSize << 16);
    DIBHeader[23] = (unsigned char)(picSize << 24);

    //Loop through all width and height places to add all pixels
    int counter = 0;
    for(short j = height; j >= 0; j--)
    
        for(short i = 0; i < width; i++)
        
            //Add all 3 RGB values
            pixelArray[counter] = pixelColour[i, j].red;
            counter++;
            pixelArray[counter] = pixelColour[i, j].green;
            counter++;
            pixelArray[counter] = pixelColour[i, j].blue;
            counter++;
        
    

    //Open it
    ofstream fileWorking(fileName);

    //Write the sections
    fileWorking << generalHeader;
    fileWorking << DIBHeader;
    fileWorking << pixelArray;

    //NO MEMORY LEAKS 4 ME
    fileWorking.close();

这是一个名为“PixelMap”的类的一部分,基本上是一个帧缓冲区或表面。 PixelMap 具有变量“width”、“height”和结构数组“pixelColour”。 (包含 3 个字符的结构,称为 'red' 'green' 和 'blue')如果您想查看该类,就在这里。 (它只是一个骨架,试图先把.bmp 弄下来)

//This is a pixel map, mainly for exporting BMPs
class PixelMap

public:

    //The standard pixel variables
    int width;
    int height;
    Colour pixelColour[];

    //The constructor will set said variables
    PixelMap(int Width, int Height);

    //Manipulate pixels
    void setPixel(int X, int Y, char r, char g, char b);

    //Export the map
    void exportMap(const char* fileName);
;

(颜色是结构)

所以我的问题是,当我尝试运行它时,我得到了这个: 所以pixelArray,要导出的颜色数组被破坏了。我认为这与没有正确指定大小有关,但我尝试为其分配正确的值(3 * 宽度 * 高度(3 为 RGB))但它说它需要是一个恒定值。

非常感谢您对此问题的任何帮助!

【问题讨论】:

fileWorking &lt;&lt; generalHeader; fileWorking &lt;&lt; DIBHeader; fileWorking &lt;&lt; pixelArray; 你不应该使用文本格式的输出来写入二进制数据。 unsigned char pixelArray[] = ""; 分配给这个数组的空间永远不够。 正确分配内存后,请注意,您需要将每一行填充到 32 位边界以获得有效的 BMP 文件。 pixelColour[i, j].red; 不会像您希望的那样做。 pixelColour[i + j * width].red; 可能。 【参考方案1】:

代替

unsigned char pixelArray[]      = "";

你可以使用:

std::vector<unsigned char> pixelArray(3*width*height,0);

这声明了一个具有 3*width*height 元素的向量,初始化为 0。您可以使用与数组版本相同的语法访问元素(除了在 cmets 中指出的,您必须注意将二进制值正确写入输出文件)。

【讨论】:

所以我接受了你的建议,我需要研究向量,但是我该如何解决 fileWorking @Paolo:作为一个单独的问题可能会更好。

以上是关于BMP 导出器不工作 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何将Word中的图片批量导出为jpg格式

我用VC++写的存图像的程序,为啥保存了的BMP图像打不开,说是照片查看器不支持此个格式,

UG NX二次开发(C#)-文件-导出图像

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

如何重新导出 CLR c++ 静态库

从 .SO ( linux ) 导出 C++ 类