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/

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