【发布时间】:2016-09-22 12:59:06
【问题描述】:
我想使用 C 语言读取一个文本文件。这是文件:-
您会看到文件的文本内容中有一些模式。 0 表示什么都没有。 9 表示黑色。所以有从 0 到 9 的配色方案。
我必须为此创建一个位图图像,并且颜色取决于图案中的值。您必须使用 0-256 配色方案对其进行调整。 最终输出如下所示
现在看到文本文件内容中的图案与最终输出的位图文件相反(不是必需的)。位图图像中颜色的深浅取决于文本内容模式中的值。
谁能告诉我我是如何用 C 语言实现的。
我可以创建 BMP 文件,但不是根据文本文件中的模式。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char bitmap[1900];
// -- FILE HEADER -- //
// bitmap signature
bitmap[0] = 0x42;
bitmap[1] = 0x4d;
// file size
bitmap[2] = 58; // 40 + 14 + 12
bitmap[3] = 0;
bitmap[4] = 0;
bitmap[5] = 0;
int i=0;
// reserved field (in hex. 00 00 00 00)
for(i = 6; i < 10; i++) bitmap[i] = 0;
// offset of pixel data inside the image
for(i = 10; i < 14; i++) bitmap[i] = 0;
// -- BITMAP HEADER -- //
// header size
bitmap[14] = 40;
for(i = 15; i < 18; i++) bitmap[i] = 0;
// width of the image
bitmap[18] = 4;
for(i = 19; i < 22; i++) bitmap[i] = 0;
// height of the image
bitmap[22] = 1;
for(i = 23; i < 26; i++) bitmap[i] = 0;
// reserved field
bitmap[26] = 1;
bitmap[27] = 0;
// number of bits per pixel
bitmap[28] = 24; // 3 byte
bitmap[29] = 0;
// compression method (no compression here)
for(i = 30; i < 34; i++) bitmap[i] = 0;
// size of pixel data
bitmap[34] = 12; // 12 bits => 4 pixels
bitmap[35] = 0;
bitmap[36] = 0;
bitmap[37] = 0;
// horizontal resolution of the image - pixels per meter (2835)
bitmap[38] = 0;
bitmap[39] = 0;
bitmap[40] = 0b00110000;
bitmap[41] = 0b10110001;
// vertical resolution of the image - pixels per meter (2835)
bitmap[42] = 0;
bitmap[43] = 0;
bitmap[44] = 0b00110000;
bitmap[45] = 0b10110001;
// color pallette information
for(i = 46; i < 50; i++) bitmap[i] = 0;
// number of important colors
for(i = 50; i < 54; i++) bitmap[i] = 0;
// -- PIXEL DATA -- //
for(i = 54; i < 66; i++) bitmap[i] = 255;
FILE *file;
file = fopen("bitmap.bmp", "w+");
for(i = 0; i < 66; i++)
{
fputc(bitmap[i], file);
}
fclose(file);
return 0;
}
【问题讨论】:
-
这么多神奇的数字...为了您自己的理智,请使用命名常量!
-
请使用
unsignedchar bitmap[1900]. -
为什么在需要 24x15 的情况下制作 4x1 位图?您需要在数组中的每个位置写入 3 个字节(对于灰度每个字节都相同)像素数据,(实际上)是
array[height][width][3]。 -
是不是因为图像大小信息大于标头的 1 个字节可以容纳?该字段是
uint32_t。 -
unsigned imagesize = height * width * 3; for(int i=0; i<4; i++) { bitmap[34+i] = imagesize & 255; imagesize >>= 8; }。还要注意,只有当图像宽度是 4 的倍数(在这种情况下)时,数组宽度才等于图像宽度,因为数组宽度(它的“步幅”)本身必须始终是 4 的倍数。跨度>
标签: c image-processing bitmap