返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现BMP格式图片转化为灰度
  • 598
分享到

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

2024-04-02 19:04:59 598人浏览 泡泡鱼
摘要

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

本文实例为大家分享了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;
}

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

--结束END--

本文标题: C语言实现BMP格式图片转化为灰度

本文链接: https://lsjlt.com/news/155422.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言实现BMP格式图片转化为灰度
    本文实例为大家分享了C语言将BMP格式图片转化为灰度的具体代码,供大家参考,具体内容如下 代码如下: #include<stdio.h> #include<ma...
    99+
    2024-04-02
  • C语言实现将彩色bmp图像转化为灰图、灰度图像反色
    本文实例为大家分享了C语言实现将彩色bmp图像转化为灰图、灰度图像反色的具体代码,供大家参考,具体内容如下 彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef s...
    99+
    2024-04-02
  • C语言实现BMP图像处理(彩色图转灰度图)
    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在...
    99+
    2024-04-02
  • C语言读取和存储bmp格式图片
    开发过程中有时候需要解析bmp数据,下面先简单介绍bmp数据组成,后面附上C语言读取和存储bmp格式图片代码。 典型的位图文件格式通常包含下面几个数据块: 1、BMP文件头:保存位图...
    99+
    2024-04-02
  • Java实现bmp和jpeg图片格式互转
    目录Bmp转JpegJpeg转BmpBmp转Jpeg public static String bmp2Jpeg(String filePath, String outPath) {...
    99+
    2023-05-15
    Java bmp和jpeg互转 Java bmp jpeg
  • Java如何实现bmp和jpeg图片格式互转
    这篇“Java如何实现bmp和jpeg图片格式互转”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何实现bmp和jp...
    99+
    2023-07-06
  • Java怎么实现bmp和jpeg图片格式互转
    这篇文章主要介绍“Java怎么实现bmp和jpeg图片格式互转”,在日常操作中,相信很多人在Java怎么实现bmp和jpeg图片格式互转问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么实现bmp和j...
    99+
    2023-07-06
  • C语言实现BMP图像细化处理
    细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 ...
    99+
    2024-04-02
  • python如何实现将JPG、BMP图片转化为bgr
    这篇文章主要介绍“python如何实现将JPG、BMP图片转化为bgr”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python如何实现将JPG、BMP图片转化为bgr”文章能帮助大家解决问题。py...
    99+
    2023-07-05
  • C语言实现bmp图像对比度扩展
    假设有一幅图,由于成象时光照不足,使得整幅图偏暗(例如,灰度范围从0到63);或者成象时光照过强,使得整幅图偏亮(例如,灰度范围从200到255),我们称这些情况为低对比度,即灰度都...
    99+
    2024-04-02
  • C++实现bmp格式图像读写
    bmp格式图像有一个特点就是这类数据被分为四个部分: 1.位图文件头(Bitmap File Header) ,大小:14字节 主要包括位图文件大小和位图文件类型信息 2.位图信息头...
    99+
    2024-04-02
  • C语言实现BMP图像处理(直方图均衡化)
    本文实例为大家分享了C语言实现BMP图像直方图均衡化处理的具体代码,供大家参考,具体内容如下 计算步骤: 1)统计各灰度值的概率; 2)计算了累积概率直方图(CDF); 3)取整扩展...
    99+
    2024-04-02
  • C语言实现bmp图像平移操作
    平移变换是一种几何变换。平移的公式为:x1=x0+t,y1=y0+t,其中(x0,y0)是原图像中的坐标,(x1,y1)是经过平移变换后的对应点的坐标。 在编程中,先将处理后图像的所...
    99+
    2024-04-02
  • C#/VB.NET 实现彩色PDF转为灰度PDF
    目录配置程序环境转彩色PDF为灰度转换结果补充本文以C#代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即 将PDF文档里面的彩色图片或者文字等通过调用PdfGra...
    99+
    2024-04-02
  • C语言实现BMP图像的读写功能
    C语言实现BMP图像的读写 对于刚接触数字图像的同学,应该都有一个疑问,如何把一个BMP格式的图像用纯C语言读入呢,我相信这也是数字图像处理的第一步,如果有幸看到这篇文档,我就有幸的...
    99+
    2024-04-02
  • C语言实现BMP图像开运算处理
    开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。 运算:用B开启A就是选出了A中某些与B相匹配的点,这些...
    99+
    2024-04-02
  • C语言实现BMP图像闭运算处理
    闭运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。填充比结构元素小的缺口或孔,搭接短的间断而起到连接作用。 运算:也就是先膨胀后腐蚀。 #include ...
    99+
    2024-04-02
  • c语言常见图片格式判断实例
    我想尽各种思路。今天,终于把图片判断搞定了。 在此,我写一下我的思路。希望对那些不想看代码的朋友们有帮助。 常风的的图片格式有:bmp,png,jpg,gif等图片格式。 我用的方法...
    99+
    2022-11-15
    c语言 图片 格式判断
  • Java如何实现将PDF转为图片格式
    本文小编为大家详细介绍“Java如何实现将PDF转为图片格式”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现将PDF转为图片格式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。代码编译环境Intel...
    99+
    2023-07-05
  • Python实现图片格式转换
    本文实例为大家分享了Python实现图片格式转换的具体代码,供大家参考,具体内容如下 碰上这样一个情景: 我从网络上下载了一张表情包图片,存放在 MyImages 文件夹下,文件类型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作