在C+中生成位图+; 我试图生成一个图像作为C++写的项目的输出。由于位图图像与大多数其他图像格式相比非常简单,所以我认为应该尝试创建位图。我不能使用任何不随g++提供的库。我想从头开始生成图像

在C+中生成位图+; 我试图生成一个图像作为C++写的项目的输出。由于位图图像与大多数其他图像格式相比非常简单,所以我认为应该尝试创建位图。我不能使用任何不随g++提供的库。我想从头开始生成图像,c++,bitmap,C++,Bitmap,图像的尺寸将是预定义的。唯一的输入是每个像素的值 这就是我到目前为止所做的: #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

图像的尺寸将是预定义的。唯一的输入是每个像素的值

这就是我到目前为止所做的:

#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;
}


}
#包括
#包括
使用名称空间std;
#在pix 2中定义w_
#在pix 4中定义h_
短填充=0x0000;
短BM=0x4d42;
结构bmp_头
{
int size_文件的_;
国际储备;
pixle数据的int偏移量;
_头的int size_;
整数宽度;
内部高度;
颜色平面的短数量;
每像素位的短数字;
int压缩;
pix_数据的int size_;
int h_分辨率;
int v_分辨率;
调色板中颜色的整数;
int重要颜色;
}
收割台;
//pix阵列///////////////////////////////////////////////////////////////////////////
//从左到右//
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,0xFF,0xFF};
////////////////////////////////////////////////////////////////////////////////////////
int main()
{
文件的HEADER.size_=sizeof(HEADER)+sizeof(BGR)+sizeof(padding)*h_in_pix+2;

编写位图并不是那么简单,有几种BMP文件

您应该尊重microsoft关于BMP的规范,并且在所有可能的格式中遵循这些规范可能会非常烦人

我猜,您的错误是每一行都有一个特定的大小,可能包含内存对齐的填充,请参见上面链接中的wikipedia图像

每一行(称为跨步)都有一个特定的大小((宽度*位/像素)+7)/8字节

在代码中,您可以尝试检查行

file.write ((char*)(&padding), 2);
相反,您需要在那里写入
((w_in_pix*24)+7)/8)-(w_in_pix*3)
空字节 我希望我做了正确的计算:)

如果可以的话,我建议你改用开源库,这会让你省去很多麻烦

在谷歌上搜索,我发现这个库看起来很小,只有5个文件可以包含在你的项目中。
使用非常简单,而且似乎适合您的需要。

BMP通过步幅的概念来工作。每行(行)都是一个步幅,可能包含比实际像素数更多的字节。要计算步幅,请使用公式((宽度*位/像素)+7)/8感谢您抽出时间来帮助我。移动像素是什么意思?我该怎么做?做得好,显示了尝试,并确定了具体问题。不过,您应该缩进代码。