Linux下读取24位BMP图像出错

原始图像: 24位BMP图像  

                   图像大小484*484

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <pthread.h>
#include <sys/shm.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<unistd.h>

#pragma pack(2)

typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
//typedef long LONG;

//位图文件头定义
typedef struct BMP_FILE_HEADER
{
    WORD bType;                                          //文件类型
	DWORD bSize;
	WORD bReserved1;
	WORD bReserved2;
	DWORD bOffset;
} __attribute__((packed)) BMPFILEHEADER;

// 位图信息头定义
typedef struct BMP_INFO
{
	DWORD bInfoSize;
	DWORD bWidth;
	DWORD bHeight;
	WORD bPlanes;
	WORD bBitCount;
	DWORD bCompression;
	DWORD bmpImageSize;
	DWORD bXPelsPerMeter;
	DWORD bYPelsPerMeter;
	DWORD bClrUsed;
	DWORD bClrImportant;
} __attribute__((packed)) BMPINF;

//彩色表:调色板 24位的真彩图不需要调色板
typedef struct RGB_QUAD
{
	WORD rgbBlue;     // 蓝色强度 
	WORD rgbGreen;    // 绿色强度 
	WORD rgbRed;      // 红色强度 
	WORD rgbReversed; // 保留值 
} __attribute__((packed)) RGBQUAD;

//像素信息
typedef struct tagIMAGEDATA
{
	BYTE blue;
	BYTE green;
	BYTE red;
}__attribute__((packed)) IMAGEDATA;

typedef struct
{
	int width;
	int height;
	BYTE  *imageData;

} __attribute__((packed)) IMAGE;

出错:


位图文件头主要是对位图文件的一些描述:BMPFileHeader

文件标识符 = 0X4D42
BMP 文件大小 = 702824 字节
保留值1 = 54
保留值2 = 0
文件头的最后到图像数据位开始的偏移量 = 40 字节


位图信息头主要是对位图图像方面信息的描述:BMPInfo

信息头的大小 = 484 字节
位图的高度 = 2834
位图的宽度 = 0

图像的位面数(位面数是调色板的数量,默认为1个调色板) = 0
每个像素的位数 = 0 位

压缩类型 = 0
图像的大小 = 726029094 字节
水平分辨率 = 1180640838
垂直分辨率 = 2084855148
使用的色彩数 = -1633571201
重要的色彩数 = -1092436037


之前的代码是在winows上编译,可以通过,迁移到Linux上之后,就出现无法正常读取图像,

试了很久,将BMP图像结构体信息中所有带long类型的变量改成int类型,即可解决

更新之后的代码

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <pthread.h>
#include <sys/shm.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<unistd.h>

#pragma pack(2)

typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;    //更改此处,将原本的long改成int
//typedef long LONG;

//位图文件头定义
typedef struct BMP_FILE_HEADER
{
    WORD bType;                                          //文件类型
	DWORD bSize;
	WORD bReserved1;
	WORD bReserved2;
	DWORD bOffset;
} __attribute__((packed)) BMPFILEHEADER;

// 位图信息头定义
typedef struct BMP_INFO
{
	DWORD bInfoSize;
	DWORD bWidth;
	DWORD bHeight;
	WORD bPlanes;
	WORD bBitCount;
	DWORD bCompression;
	DWORD bmpImageSize;
	DWORD bXPelsPerMeter;
	DWORD bYPelsPerMeter;
	DWORD bClrUsed;
	DWORD bClrImportant;
} __attribute__((packed)) BMPINF;

//彩色表:调色板 24位的真彩图不需要调色板
typedef struct RGB_QUAD
{
	WORD rgbBlue;     // 蓝色强度 
	WORD rgbGreen;    // 绿色强度 
	WORD rgbRed;      // 红色强度 
	WORD rgbReversed; // 保留值 
} __attribute__((packed)) RGBQUAD;

//像素信息
typedef struct tagIMAGEDATA
{
	BYTE blue;
	BYTE green;
	BYTE red;
}__attribute__((packed)) IMAGEDATA;

typedef struct
{
	int width;
	int height;
	BYTE  *imageData;

} __attribute__((packed)) IMAGE;

信息打印不出错了


位图文件头主要是对位图文件的一些描述:BMPFileHeader

文件标识符 = 0X4D42
BMP 文件大小 = 702824 字节
保留值1 = 0
保留值2 = 0
文件头的最后到图像数据位开始的偏移量 = 54 字节


位图信息头主要是对位图图像方面信息的描述:BMPInfo

信息头的大小 = 40 字节
位图的高度 = 484
位图的宽度 = 484
图像的位面数(位面数是调色板的数量,默认为1个调色板) = 1
每个像素的位数 = 24 位
压缩类型 = 0
图像的大小 = 702770 字节
水平分辨率 = 2834
垂直分辨率 = 2834
使用的色彩数 = 0
重要的色彩数 = 0


 

打印BMP图像信息的代码

//读取bmp文件的文件头和信息头
    fread(&bmpFileHeader, sizeof(BMPFILEHEADER), 1, fp);
    fread(&bmpInfo, sizeof(BMPINF), 1, fp);

    // 输出BMP文件的位图文件头的所有信息
    printf("位图文件头主要是对位图文件的一些描述:BMPFileHeader\n\n");
    printf("文件标识符 = 0X%X\n", bmpFileHeader.bType);
    printf("BMP 文件大小 = %d 字节\n", bmpFileHeader.bSize);
    printf("保留值1 = %d \n", bmpFileHeader.bReserved1);
    printf("保留值2 = %d \n", bmpFileHeader.bReserved2);
    printf("文件头的最后到图像数据位开始的偏移量 = %d 字节\n", bmpFileHeader.bOffset);

    // 输出BMP文件的位图信息头的所有信息
    printf("\n\n位图信息头主要是对位图图像方面信息的描述:BMPInfo\n\n");
    printf("信息头的大小 = %d 字节\n", bmpInfo.bInfoSize);
    printf("位图的高度 = %d \n", bmpInfo.bHeight);
    printf("位图的宽度 = %d \n", bmpInfo.bWidth);
    printf("图像的位面数(位面数是调色板的数量,默认为1个调色板) = %d \n", bmpInfo.bPlanes);
    printf("每个像素的位数 = %d 位\n", bmpInfo.bBitCount);
    printf("压缩类型 = %d \n", bmpInfo.bCompression);
    printf("图像的大小 = %d 字节\n", bmpInfo.bmpImageSize);
    printf("水平分辨率 = %d \n", bmpInfo.bXPelsPerMeter);
    printf("垂直分辨率 = %d \n", bmpInfo.bYPelsPerMeter);
    printf("使用的色彩数 = %d \n", bmpInfo.bClrUsed);
    printf("重要的色彩数 = %d \n", bmpInfo.bClrImportant);

感谢以下博客的贡献:

https://blog.csdn.net/Meteor_s/article/details/82425610

https://www.bbsmax.com/A/gVdnYgpa5W/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章