在C ++中生成位图

时间:2011-10-30 00:43:52

标签: c++ bitmap

我正在尝试生成一个图像作为用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;
}


}

我开始使用我在网上发现的一些代码,并且一直在调整它,但我遇到了两个问题。

  1. 我只能更改图像的垂直高度。如果我改变宽度,输出的图像就会被破坏。我认为这与尺寸计算有关。
  2. 我不确定如何一次一个地提供每个像素的颜色数据。
  3. 有什么建议吗?

1 个答案:

答案 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个文件可以包含在你的项目中。 使用起来非常简单,对你想做的事情来说似乎很好。