24位bmp图修改为灰度图

注意 数据类型占内存大小[各个系统不一样..]会导致读取数据有问题...
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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值