//一个使用CImage类将彩色jpeg图像转换成灰度图像的小程序

//本小程序使用VS2022编程环境,在C++空项目中使用CImage类将彩色jpeg图像转换成灰度图像

//相关代码及注释如下:

#include<iostream>

#include<atlimage.h> //处理图像类对象必须包含的头文件

#include<string.h>

using namespace std;

void ColorToGray(LPCTSTR srcFilePath, LPCTSTR destFilePath)

{

CImage srcImage; //声明图像类对象

srcImage.Load(srcFilePath); //将源图像载入

int width = srcImage.GetWidth(); //获得源图像像素宽度值

int height = srcImage.GetHeight();//获得源图像像素高度值

int bpp = srcImage.GetBPP();

int pitch = srcImage.GetPitch(); //每行字节数

BYTE* pImage = (BYTE*)srcImage.GetBits();//获取图像起始位置指针,GetBits返回的是未定类型,强转一下

cout << "源图像相关信息" << endl;

cout << "图像宽度:" << width << "像素" << endl;

cout << "图像高度:" << height << "像素" << endl;

cout << "分 辨 率:" << width * height / 10000 << "万像素" << endl;

cout << "位 深 度:" << bpp << endl;

system("pause");

for (int x = 0; x < width; x++) //双重循环遍历各像素点

{

for (int y = 0; y < height; y++)

{

BYTE r = *(pImage + pitch * y + x * bpp / 8 + 0);

BYTE g = *(pImage + pitch * y + x * bpp / 8 + 1);

BYTE b = *(pImage + pitch * y + x * bpp / 8 + 2);

//这里指针移动不是通过pImage++自增移动,而是始终以首地址为基准,通过加每行字节(GetPitch)乘行数,

//再加指定位置像素所在列位置(通过GetBPP/8+0/1/2得到,GetBPP得到的是位数值通过除8的到字节数),还

//得加上r、g、b位置。因为像素每行末尾可能存在空字节,所以这种方法比使用pImage++的方法简单。

BYTE gray = round(r * 0.299 + g * 0.587 + b * 0.114);

//彩色图像转换成灰度图像的转换公式

*(pImage + pitch * y + x * bpp / 8 + 0) = gray;

*(pImage + pitch * y + x * bpp / 8 + 1) = gray;

*(pImage + pitch * y + x * bpp / 8 + 2) = gray;

//这里实际是伪转换,图像的大小没有改变,只是r、g、b三个字节都使用相同颜色值。

}

}

srcImage.Save(destFilePath);

//保存转换成灰度的图形

}

int main()

{

LPCTSTR srcFilePath = _T("C:\\Users\\Administrator\\Desktop\\1111.jpg"); //源文件

LPCTSTR destFilePath = _T("C:\\Users\\Administrator\\Desktop\\2222.jpg"); //目标文件

ColorToGray(srcFilePath, destFilePath);

return 0;

}

相关推荐
李纲明6 小时前
微信小程序 getSystemInfo 提示已废弃、屏幕高度算错胶囊还对不齐?getWindowInfo 和 getDeviceInfo 怎么接才稳
javascript·微信小程序·小程序·小程序开发·devdiy
csdn_aspnet7 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步8 小时前
string的使用(2)
c++
dreams_dream8 小时前
微信小程序-使用npm包
微信小程序·小程序·npm
青少儿编程课堂8 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack10 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂11 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso12 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
caoliaoerweima12 小时前
草料二维码小程序上线活码编辑器:手机上也能编辑活码了
智能手机·小程序·编辑器·草料二维码
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习