利用GDI+处理图像的色彩

首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下:

typedef struct {

  REAL m[5][5];

} ColorMatrix;

ColorMatrix结构体一般和ImageAttribute类配合使用,使用的方式是先调用ImageAttibute::SetColorMatrix,运用该颜色变化矩阵,然后在绘制函数中将ImageAttribute对象作为DrawImage函数参数。以下的图像色彩变换都会用到这个结构体。

一、改变图像的透明度:只需要缩放Alpha分量就能到达效果。

int GetEncoderClsid(const WCHAR* format, CLSID* pClisd); // 获取对应编码器的CLSID

int CMyDlg::GetEncoderClsid(const WCHAR* format, CLSID* pClisd) // 获取对应编码器的CLSID
{
  UINT num = 0; // 图像编码器的数量
  UINT size = 0; // 图像编码器数组的字节数

  Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
  GetImageEncodersSize(&num, &size);
  if (size == 0)
  return -1;
  pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));

  GetImageEncoders(num, size, pImageCodecInfo);
  for(UINT j = 0;j<num;++j)
  {
    if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
    {
      *pClisd = pImageCodecInfo[j].Clsid;
      free(pImageCodecInfo);
      return j;
    }
  }
  free(pImageCodecInfo);
  return -1;
}

/**********************************************************************************
* 作用:改变指定图像的透明度,并将新图像按照指定的图像格式和路径保存
* 参数:imagePath 为原图路径
* alpha 为分量缩放系数
* savePath 为用于保存处理后图像的路径
* 返回值: 转换是否成功
**********************************************************************************/
BOOL ChangeImageAlpha(const CString& imagePath, REAL alpha, const CString& 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(0, 0, nWidth, nHeight);
  // 利用新图像对象绘制
  Graphics graph(&image);

  // 构建颜色变化矩阵
  ColorMatrix colorMatrix = {
  1, 0, 0, 0, 0,
  0, 1, 0, 0, 0,
  0, 0, 1, 0, 0,
  0, 0, 0, alpha, 0,
  0, 0, 0, 0, 1
  };

  ImageAttributes imageAttr;
  imageAttr.SetColorMatrix(&colorMatrix);

  // 运用颜色变换矩阵绘制新图像
  graph.DrawImage(&bitmap, rect, 0, 0, nWidth, nHeight, UnitPixel, &imageAttr);

  CLSID encoderClsid; // 文件编码器的CLSID
  CString strExt = savePath.Right(3);
  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, 0,
    0.587f, 0.587f, 0.587f, 0, 0,
    0.114f, 0.114f, 0.114f, 0, 0,
    0, 0, 0, 1, 0,
    0, 0, 0, 0, 1
  };

三、改变图像的亮度:是通过改变红、绿、蓝颜色分量的增量来实现的。公式如下:  

  // brightness 为亮度变化量

  REAL f = brightness / 255.0f;
  // 构建颜色变化矩阵
  ColorMatrix colorMatrix = {
    1, 0, 0, 0, 0,
    0, 1, 0, 0, 0,
    0, 0, 1, 0, 0,
    0, 0, 0, 1, 0,
    f, f, f, 0, 1
  };

四、改变图像的对比度:一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度越小,则会让图画显得比较灰暗。

  图像的对比度变化公式如下:其中f为对比度,默认为1.

  Rt = 128 + (R - 128)f

  Gt = 128 + (G -128)f

  Bt = 128+ (B - 128)f

  REAL f = 0.0f;
  if (contrast >= 0)
    f = (contrast + 10.0f) / 10.0f;
  else
    f = (255 + contrast) / 255.0f;
  // 构建颜色变化矩阵
  ColorMatrix colorMatrix = {
    f, 0, 0, 0, 0,
    0, f, 0, 0, 0,
    0, 0, f, 0, 0,
    0, 0, 0, 1, 0,
    0.5f*(1-f), 0.5f*(1 - f), 0.5f*(1 - f), 0, 1
  };

  

原文地址:https://www.cnblogs.com/luzuwei/p/9022354.html

时间: 2024-07-30 21:35:16

利用GDI+处理图像的色彩的相关文章

超全面的.NET GDI+图形图像编程教程

本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了分享给大家,纯手工码了好几天的字,喜欢的表忘了点赞哦~给点小小的动力~ 目录: <GDI+绘图基础> 1 GDI+概述 2 Graphics类 2.1 Graphics类的方法成员 2.2 引用命名空间 3 常用画图对象 3.1 Pen类 3.2 Color结构 3.3 Font类 3.4 Bru

利用cvKMeans2()实现图像聚类(位置+颜色)

///利用opencv提供的函数cvKMeans2()实现图像聚类 ///////运行环境:VC6.0+opencv1.0 ///////////////使用的时候,改变flag的初始值,即可实现对灰度图.彩色图基于色彩的聚类,以及根据位置和色彩对彩色图像聚类. ////////////////最后结果显示的时候请注意pResult 和pResult3 #include "cv.h" #include "cxcore.h" #include "highgu

学习笔记:利用GDI+生成简单的验证码图片

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 学习笔记:利用GDI+生成简单的验证码图片 1 /// <summary> 2 /// 单击图片时切换图片 3 /// </summary> 4 /// <param name="sender">&

8 个优秀的 Linux 图形图像及色彩工具

8 个优秀的 Linux 图形图像及色彩工具 1. 硬件色彩分析器LPROF LPROF 是一个用于创建设备兼容,如相机.扫描仪.显示器的ICC兼容型材的颜色分析器.这些配置提供跨设备的色彩一致性.他们可以用在颜色配置文件识别软件,如GIMP与Scribus. 2. 从高端照相机导入Raw数据的工具 UFRaw UFRaw是一个原始图像处理工具.它用来处理数码相机中的原始格式图片,生成常见的图片格式.它既可独立使用,也可作为 GIMP 的插件.命令行模式允许你对图片进行批量处理.它还支持色彩管理

利用matlab给图像加高斯噪声

I = imread('DSC_0034.JPG'); J = imnoise(I,'gaussian',0.20); figure, imshow(I), figure, imshow(J) 利用matlab给图像加高斯噪声

C#利用GDI+绘制旋转文字等效果

C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. [csharp] view plaincopy using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D;

利用GDI+制作Flappy Bird

上次介绍用GDI+写了个验证码图片生成器,这次再来介绍下用GDI+写之前流行过一段时间的小游戏:Flappy Bird.通过写这个游戏再来熟悉下GDI+的一些简单利用. 这是一个粗糙的游戏画面,大家不要介意啊,毕竟这是美工做的事: 先来分析一下这个游戏要怎么写.游戏过程是:1.小鸟不停的往下掉,而且越掉越快:2.障碍物柱子不停地出现并往左移动:3.游戏一开始下面的前进条就不停地转动. 游戏规则:1.小鸟的身体不能触碰障碍物:2.小鸟的身体不能触及底部及上部:3.每当小鸟穿过一个障碍物时统计通过障

C#利用GDI+绘制旋转文字等效果实例

本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

opencv_图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学

一.色彩空间理论 几种色彩空间: 1.RGB Red 红色,0-255 Green 绿色,0-255 Blue 蓝色,0-255  2.HSI HSI色彩空间可以用一个圆锥空间模型来描述.用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调.亮度和色饱和度的变化情形表现得很清楚. 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度.由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉