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 << generalHeader; fileWorking << DIBHeader; fileWorking << 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++的主要内容,如果未能解决你的问题,请参考以下文章
我用VC++写的存图像的程序,为啥保存了的BMP图像打不开,说是照片查看器不支持此个格式,