我正在尝试复制这里找到的bmp:https://en.wikipedia.org/wiki/BMP_file_format(它的2x2)。每当我尝试在油漆或photoviewer中打开它或它所说的任何东西都不受支持。我不确定我在这里做错了什么。我已经多次查看十六进制值,并且所有内容(据我所知)看起来都相同。帮助
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream bitmap;
unsigned char bm_header[14] =
/*BM*/ { 0x4D, 0x42,
/*70 bytes*/ 0x00, 0x00, 0x00, 0x46,
/*Unused */ 0x00, 0x00, 0x00, 0x00,
/* 54 bytes */ 0x00, 0x00, 0x00, 0x36 };
unsigned char dib_header[40] =
/*40 bytes*/ { 0x00, 0x00, 0x00, 0x28,
/*2 pixels wide*/ 0x00, 0x00, 0x00, 0x02,
/*2 pixels tall*/ 0x00, 0x00, 0x00, 0x02,
/*1 plane */ 0x00, 0x01,
/*24 bits */ 0x00, 0x18,
/*0 */ 0x00, 0x00, 0x00, 0x00,
/*16 bytes */ 0x00, 0x00, 0x00, 0x10,
/*2835 p/m wide*/ 0x00, 0x00, 0x0B, 0x13,
/*2835 p/m tall*/ 0x00, 0x00, 0x0B, 0x13,
/*0 colors*/ 0x00, 0x00, 0x00, 0x00,
/*0 import. colors*/0x00, 0x00, 0x00, 0x00 };
unsigned char pixel_header[16] =
{0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF,
0x00, 0x00,
0x00, 0x00, 0xFF,
0x00, 0xFF, 0x00,
0x00, 0x00 };
bitmap.open("mandelbrot_1.bmp", ios::out | ios::binary);
for(int i = 0; i < 14; i++) {
bitmap << bm_header[i];
}
for(int i = 0; i < 40; i++) {
bitmap << dib_header[i];
}
for(int i = 0; i < 16; i++) {
bitmap << pixel_header[i];
}
cout << "success!" << endl;
bitmap.close();
return 0;
}
答案 0 :(得分:1)
bm_header
和dib_header
中的每个字段都与其应有的字段相反。值0x4d,0x42拼写为“MB”,而不是“BM”。序列0x00,0x00,0x00,0x46被解释为0x46000000字节,而不是0x46字节。通常,Wikipedia表中的字节按它们应该进入文件的顺序列出。
答案 1 :(得分:1)
访问YouTube并搜索手工制作的英雄位图,或者使用手工英雄的频道观看36到39集。
凯西(作者)从理论上和实践中逐渐了解了所有你需要知道的东西,直到结尾的怪癖和结构紧密的包装。
这些剧集很容易自己消费,即使你对这个系列没有兴趣或者没看过之前的剧集。
答案 2 :(得分:0)
我建议您在线搜索BITMAPINFOHEADER。这将为您提供一个可以使用的结构,而不是直接操作字节。