位图文件未按正确的顺序保存在内存中

问题描述 投票:1回答:1

我有一个24 bpp,12x12像素的位图图像。当我尝试将它加载到由qazxsw poi这个页面构建的strust时,我得到2个错误:

  1. struct Simplified Windows BMP Bitmap File Format Specification中的文件大小大小为0时应为54,而reserved2应为54时为54。 BITMAPFILEHEADER的bpp永远不对。 同一结构中的图像大小永远不对。 文件指针BITMAPIMAGEHEADER跳转到一个随机位置,该位置从内存中读取垃圾而不是位图的实际数据,除非我将其移回文件头并再次手动移动14个字节。我的问题是:我该如何解决这个问题?有没有办法来解决这个问题 ?

.

fileptr

主要:

#ifndef LOADBMP
#define LOADBMP

typedef struct BITMAPFILEHEADER //total of 14 bytes
{
    unsigned char bfType[2];
    unsigned long bfSize;
    unsigned short Reserved1;
    unsigned short Reserved2;
    unsigned long bOffBits;
}BITMAPFILEHEADER;

typedef struct BITMAPIMAGEHEADER
{
    unsigned long bisize;
    unsigned long widh;
    unsigned long height;
    unsigned short biplanes;
    unsigned short bpp;
    unsigned long compType;
    unsigned long Image_Size;
    unsigned long biXPelsPerMeter;
    unsigned long biYPelsPerMeter;
    unsigned long ClrUsed;
    unsigned long Clrimp;
}BITMAPIMAGEHEADER;

#endif //LOADBMP
c bitmap
1个回答
1
投票

在Windows中你应该添加qazxsw poi并使用qazxsw poi和qazxsw poi,它们被定义为#include <string.h> #include <stdio.h> #include "LOADBMP.h" #include "ERROR.h" void main() { BITMAPFILEHEADER BFH; BITMAPIMAGEHEADER BIH; FILE *fileptr = fopen("C:\\Users\\mishe\\Desktop\\BMP.bmp", "rb"); unsigned char *image; fread_s(&BFH, sizeof(BITMAPFILEHEADER), sizeof(BITMAPFILEHEADER), 1, fileptr); rewind(fileptr); fseek(fileptr, 14, SEEK_CUR); fread_s(&BIH, sizeof(BITMAPIMAGEHEADER), sizeof(BITMAPIMAGEHEADER), 1, fileptr); }

如果您定义自己的qazxsw poi,那么qazxsw poi运算符不能保证按预期返回14,因为结构可以填充到成员对齐。

如果您没有在Windows上编译或Windows头文件不可用,则使用编译器特定关键字来关闭结构对齐。见#include <windows.h>

或者,如下所示读取54个字节(再次,假设您不在大端机器上)

BITMAPFILEHEADER
© www.soinside.com 2019 - 2024. All rights reserved.