c++ - 创建位图文件的程序
问题描述
我的代码有问题,它是 .bmp 文件的生成器,没有任何库来生成文件。
程序生成一个空白图像,即使有像素数据。我试图改变字节,但我没有工作。
有任何想法吗?谢谢。c++ 中的代码。
代码:
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
#define BYTES_PER_PIXEL 3
#define FILE_HEADER_SIZE 14
#define INFO_HEADER_SIZE 40
struct BITMAPFILEHEADER {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
struct BITMAPINFOHEADER {
unsigned int biSize;
unsigned int biWidth;
unsigned int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
unsigned int biXPelsPerMeter;
unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
struct RGB_data {
unsigned char b;
unsigned char g;
unsigned char r;
};
int main() {
size_t height = 100;
size_t width = 50;
size_t size = width * height * 3;
//------------------------------------------------------------------------------
FILE *file = fopen("./sample.bmp", "wb");
//------------------------------------------------------------------------------
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
//------------------------------------------------------------------------------
RGB_data buffer[height][width];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
RGB_data data;
data.b = 0;
data.r = 0;
data.b = 0;
buffer[y][x] = data;
}
}
//------------------------------------------------------------------------------
bmfh.bfType = 0x4D42;
bmfh.bfSize = size + FILE_HEADER_SIZE + INFO_HEADER_SIZE;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = bmfh.bfSize - size;
//------------------------------------------------------------------------------
bmih.biSize = 40;
bmih.biWidth = width;
bmih.biHeight = height;
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biCompression = 0;
bmih.biSizeImage = size;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
//------------------------------------------------------------------------------
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
buffer[y][x].b = 10;
buffer[y][x].r = 20;
buffer[y][x].g = 30;
}
}
//------------------------------------------------------------------------------
fwrite(&bmfh, 1, FILE_HEADER_SIZE, file);
fwrite(&bmih, 1, INFO_HEADER_SIZE, file);
fwrite(&buffer, 3, size, file);
fclose(file);
//------------------------------------------------------------------------------
cout << "Image generated successfully!" << endl;
return 0;
}
PS我检查了正确的数据类型。我也尝试更改一些变量名称,但我没有工作。
解决方案
您没有g
在这里初始化值
data.b = 0;
data.r = 0;
data.b = 0;
并且还包括#pragma pack(push, 1)
在第一个结构的开头和#pragma pack(pop)
最后一个结构的结尾
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
#define BYTES_PER_PIXEL 3
#define FILE_HEADER_SIZE 14
#define INFO_HEADER_SIZE 40
#pragma pack(push, 1)
struct BITMAPFILEHEADER {
unsigned short bfType;
unsigned int bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits;
};
struct BITMAPINFOHEADER {
unsigned int biSize;
unsigned int biWidth;
unsigned int biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
unsigned int biXPelsPerMeter;
unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
struct RGB_data {
unsigned char b;
unsigned char g;
unsigned char r;
};
#pragma pack(pop)
int main() {
size_t height = 100;
size_t width = 50;
size_t size = width * height * 3;
//------------------------------------------------------------------------------
FILE *file = fopen("./sample.bmp", "wb");
//------------------------------------------------------------------------------
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
//------------------------------------------------------------------------------
RGB_data buffer[height][width];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
RGB_data data;
data.b = 0;
data.r = 0;
data.b = 0;
buffer[y][x] = data;
}
}
//------------------------------------------------------------------------------
bmfh.bfType = 0x4D42;
bmfh.bfSize = size + FILE_HEADER_SIZE + INFO_HEADER_SIZE;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = bmfh.bfSize - size;
//------------------------------------------------------------------------------
bmih.biSize = 40;
bmih.biWidth = width;
bmih.biHeight = height;
bmih.biPlanes = 1;
bmih.biBitCount = 24;
bmih.biCompression = 0;
bmih.biSizeImage = size;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
//------------------------------------------------------------------------------
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
buffer[y][x].b = 10;
buffer[y][x].r = 20;
buffer[y][x].g = 30;
}
}
//------------------------------------------------------------------------------
fwrite(&bmfh, 1, FILE_HEADER_SIZE, file);
fwrite(&bmih, 1, INFO_HEADER_SIZE, file);
fwrite(&buffer, 3, size, file);
fclose(file);
//------------------------------------------------------------------------------
cout << "Image generated successfully!" << endl;
return 0;
}
推荐阅读
- vue.js - Vuetify RadioGroup 全宽
- json - 数据序列化并将数据发送到服务器的最佳方法
- android - 使用在 Android 中扩展 Dialog 类的自定义类显示下拉项目
- ios - iOS - 如何自定义导航后栏项目的垂直位置
- html - 创建高级布局 - Flexbox 或 Table
- postgresql - 如何计算保存在磁盘上的表的大小?(PosgreSQL)
- jenkins - 在 Jenkins 服务器上运行第一个命令,在从属服务器上运行第二个命令?
- javascript - 带有“不是函数”的函数错误中的 Javascript 方法
- javascript - 将 vue.js 单文件组件添加到 js express 服务器
- reactjs - 未定义用于创建自定义 HTML 标记的 React 属性