利用GDI+处理图像的色彩
首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下:
typedef struct { REAL m[][]; } ColorMatrix;
ColorMatrix结构体一般和ImageAttribute类配合使用,使用的方式是先调用ImageAttibute::SetColorMatrix,运用该颜色变化矩阵,然后在绘制函数中将ImageAttribute对象作为DrawImage函数参数。以下的图像色彩变换都会用到这个结构体。
获取对应编码器的CLSID
int GetEncoderClsid(const WCHAR* format, CLSID* pClisd); // 获取对应编码器的CLSID int CMyDlg::GetEncoderClsid(const WCHAR* format, CLSID* pClisd) // 获取对应编码器的CLSID
{
UINT num = ; // 图像编码器的数量
UINT size = ; // 图像编码器数组的字节数 Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if (size == )
return -;
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = ;j<num;++j)
{
if (wcscmp(pImageCodecInfo[j].MimeType, format) == )
{
*pClisd = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -;
}
一、改变图像的透明度:只需要缩放Alpha分量就能到达效果。
BOOL ChangeImageAlpha(const CString& imagePath, REAL alpha, const CString& savePath);
/**********************************************************************************
* 作用:改变指定图像的透明度,并将新图像按照指定的图像格式和路径保存
* 参数:imagePath 为原图路径
* alpha 为分量缩放系数
* savePath 为用于保存处理后图像的路径
* 返回值: 转换是否成功
**********************************************************************************/
BOOL CMyGDIDlg::ChangeImageAlpha(const CString& imagePath, REAL alpha, const CString& savePath)
{
Bitmap bitmap(imagePath);
if (bitmap.GetLastStatus() != Ok)
return false; int nWidth = bitmap.GetWidth();
int nHeight = bitmap.GetHeight(); // 构建新图像对象
Bitmap image(nWidth, nHeight);
Rect rect(, , nWidth, nHeight);
// 利用新图像对象绘制
Graphics graph(&image); // 构建颜色变化矩阵
ColorMatrix colorMatrix = {
, , , , ,
, , , , ,
, , , , ,
, , , alpha, ,
, , , ,
}; ImageAttributes imageAttr;
imageAttr.SetColorMatrix(&colorMatrix); // 运用颜色变换矩阵绘制新图像
graph.DrawImage(&bitmap, rect, , , nWidth, nHeight, UnitPixel, &imageAttr); CLSID encoderClsid; // 文件编码器的CLSID
CString strExt = savePath.Right();
strExt.MakeLower();
// 根据扩展名获得不同的CLSID
if (strExt == _T("png"))
GetEncoderClsid(_T("image/png"), &encoderClsid);
else if (strExt == _T("jpg"))
GetEncoderClsid(_T("image/jpg"), &encoderClsid);
else
GetEncoderClsid(_T("image/bmp"), &encoderClsid); if (image.Save(savePath, &encoderClsid, NULL) == Ok)
return true;
else
return false;
}
调用: ChangeImageAlpha(_T("E:\\素材\\jpg\\1.jpg"), 0.5, _T("D:\\1.png"));
二、将图像转换为灰度图:原理就是使图中红、绿、蓝3个分量值相等。一般有3中方式:
(1)平均值法:使每个像素的三原色值等于红、绿、蓝3分量的平均值
R = G = B = (R + G +B) / 3
(2)最大值法:每个像素的三原色等于红、绿、蓝3分量的最大值
R = G = B = max(R, G, B)
(3)加权平均值法:给予红、绿、蓝3分量不同的权值然后相加
R = G = B = WrR + WgG + WbB
人眼对于三原色的敏感度从高到底分别是绿、红、蓝,所以三原色权值取值关系应该是 Wg > Wr > Wb。
依据YUV颜色空间可知当 R = G = B = 0.299R + 0.587 + 0.114B时能够的到最合理的灰度图。
算法与前文类似,在这里只需修改一下颜色变化矩阵即可:
// 构建颜色变化矩阵 ColorMatrix colorMatrix = {
0.299f, 0.299f, 0.299f, , ,
0.587f, 0.587f, 0.587f, , ,
0.114f, 0.114f, 0.114f, , ,
, , , , ,
, , , ,
};
三、改变图像的亮度:是通过改变红、绿、蓝颜色分量的增量来实现的。公式如下:
// brightness 为亮度变化量 REAL f = brightness / 255.0f;
// 构建颜色变化矩阵
ColorMatrix colorMatrix = {
, , , , ,
, , , , ,
, , , , ,
, , , , ,
f, f, f, ,
};
四、改变图像的对比度:一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度越小,则会让图画显得比较灰暗。
图像的对比度变化公式如下:其中f为对比度,默认为1.
Rt = 128 + (R - 128)f
Gt = 128 + (G -128)f
Bt = 128+ (B - 128)f
REAL f = 0.0f;
if (contrast >= )
f = (contrast + 10.0f) / 10.0f;
else
f = ( + contrast) / 255.0f;
// 构建颜色变化矩阵
ColorMatrix colorMatrix = {
f, , , , ,
, f, , , ,
, , f, , ,
, , , , ,
0.5f*(-f), 0.5f*( - f), 0.5f*( - f), ,
};
利用GDI+处理图像的色彩的更多相关文章
- 利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。
一.图像的裁剪显示:有时程序需要显示图像的一部分而不是全部.实例代码如下: CDC* pDC = GetDC(); Graphics graph(pDC->GetSafeHdc()); Imag ...
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- 利用OpenCV给图像添加中文标注
利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html 和https://blog.csdn.net/ ...
- [转]超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ GDI+绘图基础 编写图形程序时需要使用GDI(Gr ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
- 8 个优秀的 Linux 图形图像及色彩工具
8 个优秀的 Linux 图形图像及色彩工具 1. 硬件色彩分析器LPROF LPROF 是一个用于创建设备兼容,如相机.扫描仪.显示器的ICC兼容型材的颜色分析器.这些配置提供跨设备的色彩一致性.他 ...
- 利用matlab求图像均值和方差的几种方法
一.求均值 % 求一副灰度图像的均值 close all; clear; clc; i=imread('d:/lena.jpg'); %载入真彩色图像 i=rgb2gray(i); %转换为灰度图 i ...
- OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换
1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...
随机推荐
- android DatagramSocket send 发送数据出错
安卓4.0以后好像不能在主线程里面使用 socket 所以不管是发送数据还是接收数据需要新开一个了线程: 以下代码是我点击发送是代码: new Thread(new Runnable() { @Ove ...
- 图解http学习笔记【一】
不想单纯的把书里的知识点罗列一遍 这周,我们的安全代码终于改完了.我在微信上报了个叫 一修读书的课程,现在已经听了6天.感觉并不是很神奇,聊胜于无.倒是趁着当当搞活动买回来好几本书,其中就有这本图解h ...
- OneZero第三周——预完成功能点统计
本周OneZero将完成“摇一摇”功能. 功能点统计如下: 1.点击主页面“摇一摇”按钮,进入摇一摇界面. 2.摇一摇界面布局(上,中,下). 3.摇动手机,在摇一摇界面中显示一条消费记录. 4.继续 ...
- 【Apache】Apache服务的基本概念(二)
Apache服务的基本概念 Apache安装请参照:[Apache]Apache服务的安装(一) 1.端口 apache默认监听TCP协议端口80端口 2.apache服务 apache服务默认会启动 ...
- HQL和SQL查询
转自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097 HQL和SQL的区别 标签: sqlhibernatejavasessio ...
- kbmMW均衡负载与容灾(2)(转载红鱼儿)
集中式均衡负载 为实现集中式均衡负载方案,需要实现两个不同的应用服务器,一个是只包含均衡负载组件再无其他内容的应用服务器,可称之为均衡负载应用服务器,下文简称LB Server,另外一个就是包含一个或 ...
- Linux 在文档中查找满足条件的行并输出到文件:
Linux 在文档中查找满足条件的行并输出到文件: 文件名称: dlog.log 输出文件: out.log 1.满足一个条件(包含 “TJ” )的语句: grep “TJ” dlog. ...
- Linux服务器上新增开放端口号
开放端口的方法: 方法一:命令行方式 1. 开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT ...
- 2018.11.24 poj3261Milk Patterns(后缀数组)
传送门 后缀数组经典题. 貌似可以用二分答案+后缀数组? 我自己yyyyyy了一个好写一点的方法. 直接先预处理出heightheightheight数组. 然后对于所有连续的k−1k-1k−1个he ...
- 关于对话框不能响应OnKeyDown和OnChar函数的一些说明
(1)现象 在MFC的对话框中,映射了WM_CHAR和WM_KEYDOWN消息响应函数后,还是不能响应OnKeyDown和OnChar. (2)原因 因为MFC在进行设计的时候,这两个消息被对话框 ...