存储 BMP 文件的像素值

Posted

技术标签:

【中文标题】存储 BMP 文件的像素值【英文标题】:Storing pixel values of a BMP file 【发布时间】:2014-04-08 06:04:36 【问题描述】:

我正在尝试将 BMP 文件的像素值存储在 2D 动态分配的结构数组中,但它不断给出分段错误。到目前为止,这是我所拥有的:

#include <stdio.h>
#include <stdlib.h>

typedef struct PIXEL
        unsigned char Red, Green, Blue;
*pixel;

int main (int argc, char *argv[])

        //variable declarations and open the file
        FILE* fin = fopen(argv[1], "rb");
        if (fin == NULL)
                printf("Error opening file.\n");
                exit(0);
        
        unsigned char info[54];
        int width, height, i, j;

        fread(info, sizeof(unsigned char), 54, fin);    //read the header
        width = *(int*)&info[18];
        height = *(int*)&info[22];

        pixel **image = (pixel **) malloc(sizeof(pixel *) * width); //reserve enough space for RGB for each pixel
        for (i = 0; i < width; i++)
                image[i] = (pixel *) malloc(sizeof(pixel) * height);
        

        for (i = 0; i < width; i++)
                for (j = 0; j < height; j++)
                        image[i][j]->Blue = getc(fin);  //put the blue value of the pixel
                        image[i][j]->Green = getc(fin); //green value
                        image[i][j]->Red = getc(fin);   //red value
                        printf("Pixel %d: [%d, %d, %d]\n", (i+1)*(j+1), image[i][j]->Blue, image[i][j]->Green, image[i][j]->Blue);
                
        

        fclose(fin);
        return 0;

【问题讨论】:

printf 行应该有 image[i][j]->Red 而不是 image[i][j]->Blue 两次 它给你的错误是哪一行?使用像 Visual Studio Express 这样的简单调试器来逐步执行您的代码。还可以尝试使用非常小的 10 x 10 像素位图来干运行代码。 啊,发现是打开bmp文件出错 在 printf 中要小心。您指定 %d 格式但给出无符号字符。这可能很危险,请改为向 (int) 添加强制转换 【参考方案1】:

您没有从标题中检查有效的宽度和高度值。如果由于任何原因它们很大(例如,如果文件读取失败),则会崩溃。

另外,printf 中的 %d 需要一个 int。您应该将 unsigned chars 转换为 int ,否则它可能会崩溃。

【讨论】:

printf 在为%d 指定char 时不会崩溃。参数会自动转换为预期的类型,并且提升 char,无论是否无符号,直到 int 都不会导致崩溃。

以上是关于存储 BMP 文件的像素值的主要内容,如果未能解决你的问题,请参考以下文章

常见图片格式详解系列---BMP位图--

获取BMP文件的像素值

从 bmp 文件中读取 RGB 像素

如何将原始数据存储在图像文件中?

C - 改变 bmp 文件的像素颜色

用C或C++怎样提取出bmp图像的像素点信息值?用LSB算法做信息隐藏,位图是24位的。