注意 数据类型占内存大小[各个系统不一样..]会导致读取数据有问题...
typedef unsigned char BYTE;//字符型
typedef unsigned short WORD;//短整型
typedef int DWORD;//长整形
typedef int LONG;
/*bmp文件信息头*/
typedef struct BItMAPFILEHEADER
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
}BITMAPFILEHEADER;
/*位图信息头 */
typedef struct BIiMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression; //压缩方式压缩方式 DWORD biSizeImage;
DWORD biSizeImage; //位图数据长度
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
///*RGB调色版*/
//typedef struct tagRGBQUAD {
// BYTE rgbBlue;
// BYTE rgbGreen;
// BYTE rgbRed;
// BYTE rgbReserved;
//} RGBQUAD;
/*16位图数据*/
typedef struct rgbDATA16
{
}RGBDATA16;
/*24位图数据*/
typedef struct rgbDATA24 /*三字节存放一个点像素*/
{
BYTE rgbRed;
BYTE rgbGreen;
BYTE rgBlue;
}RGBDATA24;
typedef struct rgbDATA32
{
BYTE rgbRed;
BYTE rgbGreen;
BYTE rgBlue;
BYTE rgbAlpha;
BYTE rgbVifrification; //透明色
}RGBDATA32;
int main(int argc, const char * argv[])
{
BITMAPFILEHEADER fileHeadT={0};
BITMAPINFOHEADER infoHead={0};
FILE *FE=fopen("/WWW1.bmp", "rb");
FILE *FE2=fopen("/Users/DaleHui/Desktop/WWW222.bmp", "wb+");
/*bmp文件信息头读取*/
fread(&fileHeadT, sizeof(BITMAPFILEHEADER), 1, FE);
/*位图信息头*/
fread(&infoHead,sizeof(BITMAPINFOHEADER) , 1, FE);
printf("位图数据长度%d",infoHead.biSizeImage);
if (fileHeadT.bfType!=0x4d42) {
printf("不是bmp文件");
fclose(FE);
return 0;
}
if (infoHead.biBitCount==16||infoHead.biBitCount==24||infoHead.biBitCount==32) {
printf("该bmp不存在调色版\n");
}
printf("%s \n",infoHead.biCompression==0?"无压缩":"该图已压缩");
RGBDATA24 *rgb24;
rgb24=calloc(infoHead.biSizeImage/3, sizeof(RGBDATA24)); //存放位图数据用的堆
int i=0;
while (i<infoHead.biSizeImage/3) {
fread((rgb24+i), sizeof(RGBDATA24), 1, FE);
(rgb24+i)->rgbGreen=(rgb24+i)->rgBlue=(rgb24+i)->rgbRed=((rgb24+i)->rgbGreen+(rgb24+i)->rgBlue+(rgb24+i)->rgbRed)/3;
i++;
}
fwrite(&fileHeadT, sizeof(BITMAPFILEHEADER), 1, FE2);
fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, FE2);
int j=0;
while ((j)<infoHead.biSizeImage/3) {
fwrite((rgb24+j), sizeof(RGBDATA24), 1, FE2);
j++;
}
free(rgb24);
fclose(FE2);
fclose(FE);
return 0;
}
24位bmp图修改为灰度图
最新推荐文章于 2024-03-21 19:48:04 发布