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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位图文件未按正确的顺序保存在内存中相关的知识,希望对你有一定的参考价值。

我有一个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
答案

在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

以上是关于位图文件未按正确的顺序保存在内存中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

继承中代码的执行顺序

Javascript中代码的执行顺序是啥?

java中代码执行顺序

JavaScript中代码注释的正确方式是啥

java中代码执行顺序