文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言实现BMP格式图片转化为灰度

2024-04-02 19:55

关注

本文实例为大家分享了C语言将BMP格式图片转化为灰度的具体代码,供大家参考,具体内容如下

代码如下:


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
 
 
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
    unsigned char bfType[2];//文件格式
    unsigned long bfSize;//文件大小
    unsigned short bfReserved1;//保留
    unsigned short bfReserved2;
    unsigned long bfOffBits; //DIB数据在文件中的偏移量
}fileHeader;
#pragma pack()

#pragma pack(1)
typedef struct tagBITMAPINFOHEADER
{
    unsigned long biSize;//该结构的大小
    long biWidth;//文件宽度
    long biHeight;//文件高度
    unsigned short biPlanes;//平面数
    unsigned short biBitCount;//颜色位数
    unsigned long biCompression;//压缩类型
    unsigned long biSizeImage;//DIB数据区大小
    long biXPixPerMeter;
    long biYPixPerMeter;
    unsigned long biClrUsed;//多少颜色索引表
    unsigned long biClrImporant;//多少重要颜色
}fileInfo;
#pragma pack()

#pragma pack(1)
typedef struct tagRGBQUAD
{
    unsigned char rgbBlue; //蓝色分量亮度
    unsigned char rgbGreen;//绿色分量亮度
    unsigned char rgbRed;//红色分量亮度
    unsigned char rgbReserved;
}rgbq;
#pragma pack()
 
int main()
{
    FILE *fp1 = fopen("C:\\Users\\Administrator\\Desktop\\data\\bmp\\image.bmp", "rb+");
    if (fp1 == NULL)
    {
        printf("打开文件fp1失败");
        exit(0);
    }
 
    FILE *fp2 = fopen("C:\\Users\\Administrator\\Desktop\\data\\bmp\\imageGray.bmp", "wb");
    if (fp1 == NULL)
    {
        printf("打开文件fp2失败");
        exit(0);
    }
 
    fileHeader * fh;
    fileInfo * fi;
    fh = (fileHeader *)malloc(sizeof(fileHeader));
    fi = (fileInfo *)malloc(sizeof(fileInfo));
 
    //读取位图头结构和信息头
    fread(fh, sizeof(fileHeader), 1, fp1);
    fread(fi, sizeof(fileInfo), 1, fp1);
 
    printf("\\\\\\\\\\\\\\\\\\\\原始图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
    printf("bmp文件头:\n");
    printf("bfSize:%d\n", fh->bfSize);
    printf("bfOffBits:%d\n", fh->bfOffBits);
    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
    printf("bmp信息头\n");
    printf("结构体长度:%d \n", fi->biSize);
    printf("位图宽度:%d \n", fi->biWidth);
    printf("位图高度:%d \n", fi->biHeight);
    printf("位图平面数:%d \n", fi->biPlanes);
    printf("颜色位数:%d \n", fi->biBitCount);
    printf("压缩方式:%d \n", fi->biCompression);
    printf("实际位图数据占用的字节数:%d \n", fi->biSizeImage);
    printf("X方向分辨率:%d \n", fi->biXPixPerMeter);
    printf("Y方向分辨率:%d \n", fi->biYPixPerMeter);
    printf("使用的颜色数:%d \n", fi->biClrUsed);
    printf("重要颜色数:%d \n", fi->biClrImporant);
    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
 
    //修改信息头
    fi->biBitCount = 8;
    //fi->biSizeImage = ((fi->biWidth * 3 + 3) / 4) * 4 * fi->biHeight;
    fi->biSizeImage = fi->biHeight*fi->biWidth;
    //修改文件头
    fh->bfOffBits = sizeof(fileHeader) + sizeof(fileInfo) + 256 * sizeof(rgbq);
    fh->bfSize = fh->bfOffBits + fi->biSizeImage;
 
    printf("\\\\\\\\\\\\\\\\\\\\修改后的图片信息\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
    printf("bmp文件头:\n");
    printf("bfSize:%d\n", fh->bfSize);
    printf("bfOffBits:%d\n", fh->bfOffBits);
    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
    printf("bmp信息头\n");
    printf("结构体长度:%d \n", fi->biSize);
    printf("位图宽度:%d \n", fi->biWidth);
    printf("位图高度:%d \n", fi->biHeight);
    printf("位图平面数:%d \n", fi->biPlanes);
    printf("颜色位数:%d \n", fi->biBitCount);
    printf("压缩方式:%d \n", fi->biCompression);
    printf("实际位图数据占用的字节数:%d \n", fi->biSizeImage);
    printf("X方向分辨率:%d \n", fi->biXPixPerMeter);
    printf("Y方向分辨率:%d \n", fi->biYPixPerMeter);
    printf("使用的颜色数:%d \n", fi->biClrUsed);
    printf("重要颜色数:%d \n", fi->biClrImporant);
    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
 
    //创建调色板
    int i,j,k=0;
    rgbq *fq = (rgbq *)malloc(256 * sizeof(rgbq));
    for (i = 0; i<256; i++)
    {
        fq[i].rgbBlue = fq[i].rgbGreen = fq[i].rgbRed = i;
    }
    //写入文件头、信息头、调色板
    fwrite(fh, sizeof(fileHeader), 1, fp2);
    fwrite(fi, sizeof(fileInfo), 1, fp2);
    fwrite(fq, sizeof(rgbq), 256, fp2);
 
    //将位图信息转为灰度
    //存储bmp一行的像素点
    //unsigned char ImgData[900][3];
    unsigned char ImgData[3000][3];
    //将灰度图像存到一维数组中
    //unsigned char grayData2[900];
    unsigned char ImgData2[3000];
    
    
    //正确算法(2)
    unsigned char * * bmp_data;
    bmp_data = new unsigned char*[fi->biHeight]; //声明一个指针数组
    unsigned char *data288 = new unsigned char[fi->biHeight*fi->biWidth];
 
    for (i = 0; i<fi->biHeight; i++)
        bmp_data[i] = new unsigned char[(fi->biWidth * 3 + 3) / 4 * 4]; //每个数组元素也是一个指针数组
    for (i = 0; i<fi->biHeight; i++)
        for (j = 0; j<(fi->biWidth * 3 + 3) / 4 * 4; j++)
            fread(&bmp_data[i][j], 1, 1, fp1);//每次只读取一个字节,存入数组
 
    for (i = 0; i<fi->biHeight; i++)//将24位真彩色转换成灰度图
        for (j = 0; j<fi->biWidth; j++){
        data288[fi->biWidth*i + j] = ((unsigned char)((float)bmp_data[i][3 * j] * 0.114 + (float)bmp_data[i][3 * j + 1] * 0.587 + (float)bmp_data[i][3 * j + 2] * 0.299));
        }
 
    fwrite(data288, fi->biSizeImage, 1, fp2);
    free(fh);
    free(fi);
    free(fq);
    fclose(fp1);
    fclose(fp2);
    printf("success\n");
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯