原始图像: 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);
感谢以下博客的贡献: