gpt4 book ai didi

c++ - 我尝试用 C++ 编写一个 bmp 文件,但是 bmp 文件的宽度和高度似乎会影响结果,有时我会得到一个错误的 bmp 文件

转载 作者:行者123 更新时间:2023-11-28 02:18:01 27 4
gpt4 key购买 nike

正如标题中所描述的那样。代码如下所示

#include <Windows.h>
#include <string>

using namespace std;

#define WIDTH 90
#define HEIGHT 180

class Test {
public:
static bool ShowWithBMP(string filename) {
BITMAPFILEHEADER bmfh; // bitmap file header
BITMAPINFOHEADER bmih; // bitmap info header (windows)

const int OffBits = 54;

bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfType = 0x4d42; //"BM"
bmfh.bfOffBits = OffBits;
bmfh.bfSize = WIDTH * HEIGHT * 3 + OffBits;

memset(&bmih, 0, sizeof(BITMAPINFOHEADER));
bmih.biSize = 40;
bmih.biPlanes = 1;
bmih.biSizeImage = 0;
bmih.biBitCount = 24;
bmih.biCompression = BI_RGB;
bmih.biWidth = WIDTH;
bmih.biHeight = HEIGHT;


FILE* file = fopen(filename.c_str(), "w");
fwrite((const void*)&bmfh, sizeof(BITMAPFILEHEADER), 1, file);
fwrite((const void*)&bmih, sizeof(BITMAPINFOHEADER), 1, file);


for (int row = 0; row < HEIGHT; ++row)
{
// RGB 24 BITS
for (int col = 0; col < WIDTH; ++col)
{
int index = row * WIDTH + col;
RGBTRIPLE pix;

pix.rgbtRed = 0;
pix.rgbtGreen = 0;
pix.rgbtBlue = 0;
fwrite((const void*)&pix, sizeof(RGBTRIPLE), 1, file);
}
}
fclose(file);
return true;
}
};

int main() {
Test::ShowWithBMP("test.bmp");
system("pause");
return 0;
}

当我设置 WIDTH 为 90 和 HEIGHT 为 180 时,输出文件“test.bmp”似乎是一个错误的文件,我无法打开它,但是当设置 WIDTH 为 100 和 HEIGHT 为 180 时,它变得正确.它出什么问题了?我尝试用 C++ 编写 bmp 文件时有什么限制吗?

最佳答案

根据内存(大约 20 年前),BMP format本质上包含像素数据的 DIB 格式。每个像素行需要是 4 字节的倍数(即整数个 DWORD);因此,您需要确保在每一行的末尾都有适当的填充。

关于c++ - 我尝试用 C++ 编写一个 bmp 文件,但是 bmp 文件的宽度和高度似乎会影响结果,有时我会得到一个错误的 bmp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33438237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com