我需要使用.bmp
类型的图片。
它的格式是:
struct bmp_fileheader
{
unsigned char fileMarker1; /* 'B' */
unsigned char fileMarker2; /* 'M' */
unsigned int bfSize; /* File's size */
unsigned short unused1; /* Aplication specific */
unsigned short unused2; /* Aplication specific */
unsigned int imageDataOffset; /* Offset to the start of image data */
};
struct bmp_infoheader
{
unsigned int biSize; /* Size of the info header - 40 bytes */
signed int width; /* Width of the image */
signed int height; /* Height of the image */
unsigned short planes;
unsigned short bitPix; /* Number of bits per pixel = 3 * 8 (for each channel R, G, B we need 8 bits */
unsigned int biCompression; /* Type of compression */
unsigned int biSizeImage; /* Size of the image data */
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
typedef struct pi {
unsigned char r;
unsigned char g;
unsigned char b;
}Pixel;
struct bmp_image {
struct bmp_fileheader file_header;
struct bmp_infoheader info_header;
Pixel ** pixel;
};
struct bmp_image image;
因此,图像包含像素的标题和矩阵(height * width
)。
我从文件中读取图像:
FILE *image_file = fopen("path.bmp", "rb");
之后,我读取了标题的所有变量,然后是像素矩阵。我需要对图像进行一些更改,以便从初始图像创建另一个black_and_white格式的图像。
这样做的算法是用(B,B,B)改变(X,Y,Z)像素,其中B = (X + Y + Z) / 3;
。我创建black_and_white图像就好了。
当我尝试将我的black_and_white图像与绘图程序生成的black_and_white图像进行比较时,问题就出现了。
cmp -lb airplane_black_white.bmp ref/airplane_black_white.bmp
cmp: EOF on airplane_black_white.bmp
答案 0 :(得分:1)
我经常看到人们一个接一个地整齐地布置像素。事实并非如此。它们在扫描线上一个接一个地布局,然后在扫描线之后扫描线,并且扫描线可以包含一些未使用的字节以在字边界上对齐它。但你说:
因此,图像包含标题和矩阵(
height * width
)像素。
不是这样。您必须处理扫描线,并且图片由包含像素的扫描线组成。这通常超过你的heigth * width
,解释为什么比较过早地看到EOF。
有关如何处理位图图像,请参阅What is wrong with this code for writing grey-scale bmp from an image RGB bmp pure C - Windows OS。