C将bmp像素读入二维数组

Posted

技术标签:

【中文标题】C将bmp像素读入二维数组【英文标题】:C read bmp pixels into 2d array 【发布时间】:2013-11-02 20:42:44 【问题描述】:

我有标题和信息标题。使用以下代码,第一个像素读取正常。

// The BMPHEADER structure.
typedef struct 
byte        sigB;
byte        sigM;
int32_t     fileSize;
int16_t     resv1;
int16_t     resv2;
int32_t     pixelOffset;
 tBmpHeader;

// The BMPINFOHEADER structure.
typedef struct 
int32_t     size;
int32_t     width;
int32_t     height;
int16_t     colorPlanes;
int16_t     bitsPerPixel;
byte        zeros[24];
 tBmpInfoHeader;

typedef uint8_t byte;

typedef struct 
byte blue;
byte green;
byte red;
 tPixel;

// A BMP image consists of the BMPHEADER and BMPINFOHEADER structures, and the 2D pixel array.
typedef struct 
tBmpHeader      header;
tBmpInfoHeader  infoHeader;
tPixel          **pixel;
 tBmp;

tPixel **BmpPixelAlloc(int pWidth, int pHeight)

    tPixel **pixels = (tPixel **)malloc (pHeight * sizeof(tPixel *));
    for (int row = 0; row < pHeight; ++row)
    
        pixels[row] = (tPixel *)malloc(pWidth * sizeof(tPixel));
    

    return pixels;


tError BmpRead(char *pFilename, tBmp *pBmp)

pBmp->pixel = BmpPixelAlloc(pBmp->infoHeader.width, pBmp->infoHeader.height);

if(FileRead(file, &pBmp->pixel, sizeof(tPixel), 1)!=0)
 
    errorCode = ErrorFileRead;


与我交谈的一位导师说我应该做以下事情

int i = 0;
while(!feof(file))

    if(FileRead(file, &pBmp->pixel[i], sizeof(tPixel), 1)!=0)
     
    errorCode = ErrorFileRead;
    
    ++i;

但这给了我一个分段错误。如果我在循环中放置一个打印,它会在说分段错误之前打印几千次。我尝试使用双 for 循环,但它甚至无法编译。我在谷歌上花了几个小时,但无法弄清楚。

【问题讨论】:

何必呢?为此已经有一个易于使用且易于理解的library。 好吧,即便如此,请尝试浏览该库中的代码。你可能会学到一些东西。 旁注:注意tBmpHeader 中的结构填充:两个单字节可能会导致一个 2 字节的孔来对齐以下uint32_t(打包结构或删除这些魔术字节并读取它们分开) @sam 是的,我已经不得不处理我最终阅读该结构的碎片。 【参考方案1】:

没关系,我想通了。

for(int i = 0; i < pBmp->infoHeader.height; ++i)

    for(int j = 0; j < pBmp->infoHeader.width; ++j)
    
        if(FileRead(file, &pBmp->pixel[i][j], sizeof(tPixel), 1)!=0)
         
            errorCode = ErrorFileRead;
        
    

【讨论】:

以上是关于C将bmp像素读入二维数组的主要内容,如果未能解决你的问题,请参考以下文章

C++ 图像处理 - 将图像文件读入二维数组

VB.NET:将 CSV 文件读入二维数组

C语言指向二维数组的指针

C语言 指针二维数组怎么初始化

通过像一维数组一样访问二维数组的双线性插值的概念

无法将制表符分隔的文件读入 numpy 二维数组