我正在尝试生成一个图像作为用C ++编写的项目的输出。由于与大多数其他图像格式相比,位图图像非常简单,我想我应该尝试创建一个位图。我不能使用任何没有g ++附带的库。我想从头开始生成图像。
图像的尺寸将是预定义的。唯一的输入是每个像素的值。
这是我到目前为止所做的:
#include <fstream>
#include <iostream>
using namespace std;
#define w_in_pix 2
#define h_in_pix 4
short padding = 0x0000;
short BM = 0x4d42;
struct bmp_header
{
int size_of_file;
int reserve;
int offset_of_pixle_data;
int size_of_header;
int width;
int hight;
short num_of_colour_plane;
short num_of_bit_per_pix;
int compression;
int size_of_pix_data;
int h_resolution;
int v_resolution;
int num_of_colour_in_palette;
int important_colours;
}
HEADER;
// pix array ///////////////////////////////////////////////////////////////////////////
// L to R //
int BGR [24] = {
0xFF,0x00,0x00, 0x00,0xFF,0x00,
0xFF,0x00,0x00, 0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF};
////////////////////////////////////////////////////////////////////////////////////////
int main()
{
HEADER.size_of_file = sizeof(HEADER) + sizeof(BGR) + sizeof(padding) * h_in_pix + 2;
cout << HEADER.size_of_file;
HEADER.reserve = 0000;
HEADER.offset_of_pixle_data = 54;
HEADER.size_of_header = 40;
HEADER.width = w_in_pix;
HEADER.hight = h_in_pix;
HEADER.num_of_colour_plane = 1;
HEADER.num_of_bit_per_pix = 24;
HEADER.compression = 0;
HEADER.size_of_pix_data = sizeof(BGR) + sizeof(padding) * h_in_pix;
HEADER.h_resolution = 2835;
HEADER.v_resolution = 2835;
HEADER.num_of_colour_in_palette = 0;
HEADER.important_colours = 0;
// write BMP Header ////////////////////////////////////////////////////////////////
ofstream file;
file.open ("test.bmp", ios::out | ios::trunc | ios::binary);
file.write ((char*)(&BM), 2);
file.write ((char*)(&HEADER), sizeof(HEADER));
////////////////////////////////////////////////////////////////////////////////////
// write BMP data //////////////////////////////////////////////////////////////////
//file.write ((char*)(&BGR[0]),1);
int position = w_in_pix * h_in_pix * 3;
while (position != 0)
{
for (int n = 0; n != w_in_pix * 3; n++)
{
file.write ((char*)(&BGR[position - w_in_pix * 3 + n]), 1);
}
file.write ((char*)(&padding), 2);
position = position - w_in_pix * 3;
}
}
我开始使用我在网上发现的一些代码,并且一直在调整它,但我遇到了两个问题。
有什么建议吗?
答案 0 :(得分:1)
编写位图并不是那么简单,有几种BMP文件。
您应该尊重有关BMP的微软规范,并且对所有可能的格式进行跟踪可能会非常烦人。
http://en.wikipedia.org/wiki/Windows_bitmap
我的错误是,每行都有一个特定的大小,可能包含内存对齐的填充,请参阅上面链接的维基百科图片。
每一行(称之为步幅)的特定大小为((宽* bitperpixel)+ 7)/ 8字节。
在您的代码中,您可以尝试检查
行file.write ((char*)(&padding), 2);
相反,您需要在那里写(((w_in_pix * 24) + 7) / 8) - (w_in_pix * 3)
个空字节
我希望我做了正确的计算:)
如果可以的话,我建议使用开源库,这样可以省去很多麻烦。
在google上搜索我刚发现http://easybmp.sourceforge.net/这个库看起来很小,只有5个文件可以包含在你的项目中。 使用起来非常简单,对你想做的事情来说似乎很好。