原始圖像: 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);
感謝以下博客的貢獻: