c - BMP{FileHeader, InfoHeader} 结构的问题

标签 c

我想将 bmp 文件加载到 C 内存中。我发现了许多不同类型的 BmpFileHeader 和 BmpInfoHeader 结构。我从 msdn.microsoft.com 获取的最后一个,但它仍然无法从二进制文件中正确读取。带测试文件lena 图片尺寸:-1076791624 无法分配内存

我错过了什么?谢谢。

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

typedef struct tagBITMAPFILEHEADER {
  unsigned short bfType;
  unsigned int bfSize;
  short bfReserved1;
  short bfReserved2;
  unsigned int bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER {
  unsigned int biSize;
  int biWidth;
  int biHeight;
  short biPlanes;
  short biBitCount;
  unsigned int biCompression;
  unsigned int biSizeImage;
  int biXPelsPerMeter;
  int biYPelsPerMeter;
  unsigned int biClrUsed;
  unsigned int biClrImportant;
} BITMAPINFOHEADER;   

int main(int argc, char *argv[])
{
   if(argc != 2)
   {
    printf("Usage: %s input.bmp\n", argv[0]);
    exit(-1);
   }

   FILE *filePtr;
   BITMAPFILEHEADER bitmapFileHeader;
   BITMAPINFOHEADER bitmapInfoHeader;
   unsigned char *bitmapImage;
   int imageIdx=0;
   unsigned char tempRGB;

   filePtr = fopen(argv[1],"rb");
   if (filePtr == NULL)
   {
    printf("File could not opened\n");
    exit(-1);
    }

    //read the bitmap file header
    fread(&bitmapFileHeader, sizeof(bitmapFileHeader), 1, filePtr);

    if (bitmapFileHeader.bfType !=0x4D42)
    {
    fclose(filePtr);
    printf("Not a bmp file\n");
    exit(-1);
    }

    fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
    bitmapImage = (unsigned char*)malloc(sizeof(unsigned char)*bitmapInfoHeader.biSizeImage);
    printf("Image Size: %d\n", bitmapInfoHeader.biSizeImage);

    if (!bitmapImage)
    {
    free(bitmapImage);
    fclose(filePtr);
    printf("Memory could not be allocated\n");
    exit(-1);
    }

    //swap the r and b values to get RGB (bitmap is BGR)
    for (imageIdx = 0; imageIdx < bitmapInfoHeader.biSizeImage; imageIdx+=3)
    {
    tempRGB = bitmapImage[imageIdx];
    bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
    bitmapImage[imageIdx + 2] = tempRGB;
    }

    int i;

    for(i = 0; i < bitmapInfoHeader.biSizeImage; i+=3){
    printf("R: %c G: %c B: %c\n", bitmapImage[i], bitmapImage[i + 1], bitmapImage[i + 2]);
    }

    fclose(filePtr); 

    return 0;

}

最佳答案

我要做的第一件事就是在byte layout上找到权威的说法。这些 header ,然后假设您想继续使用已定义的结构,请在字段偏移量上添加一些断言,例如:

assert(offsetof(BITMAPFILEHEADER, bfType) == 0);     // or whatever
assert(offsetof(BITMAPFILEHEADER, bfSize) == 2);     // or whatever
assert(offsetof(BITMAPFILEHEADER, bfOffBits) == 10); // or whatever
etc.

您使用 unsigned int、short 等以及您的编译器选项(尤其是结构打包)可能意味着您的结构字段与实际的 BMP 文件数据(偏移量,可能还有长度)不匹配。

关于c - BMP{FileHeader, InfoHeader} 结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071422/

相关文章:

c - 链接器忽略库链接

c - 这个c程序有什么问题?调试它表明程序被击中 while (sqroot != 0);

CLion 将现有的 .o 文件链接到项目

c - C sine(x) 近似误差

c - 接受超过 FD_SETSIZE 的连接

php - 如何使 ZEND_BEGIN_ARG_INFO_EX 控制传递给 PHP 扩展的参数数量?

c++ - 如何使用 Doxygen 注释生成的代码

c - 从C中的结尾访问数组?

c - header 相互使用结构和枚举?

c - C 中的 Bsearch 函数无法正常工作