码迷,mamicode.com
首页 > 其他好文 > 详细

GDI+学习之------色彩与图像

时间:2015-03-18 18:07:58      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

色彩

在GDI+中,色彩是通过Color类来描述的,不是用RGB类,用RGB构造会出错!GDI+中的色彩信息值是由一个32位的数据来表示的,它包括8位alpha值和各8位的R、G、B值,对于alpha值是用来表示透明度的,0表示完全透明,255表示不透明。从本质上讲,透明度是像素之间的一种合成运算,它的计算公式是:

输出色彩=前景色*Alpha值/255 + 背景色*(255-Alpha值)/255 

举个例子来说,假设有一个点,其色彩的红色分量值为150,背景色的红色分量值为100,在进行输出时,将透明度设置为200,放样目标区域中最最终显示的色彩将是:

150*200/255 + 100*(255-200)/255 =139

举个例子,图像合成;

先看下最终效果:

技术分享+技术分享=技术分享

原理说明:从上面的图中我们也可以看到,要实现的结果就是将王力宏装到相框中去,大家注意看相框,要装王力宏的部分全部是白色,所以如果能先把相框的白色部分设为全透明(透明度为0),然后王力宏的照片画在底层,然后再在上面盖上相框,因为相框的白色部分已经透明了,所以力宏哥哥会在透明部分被显示出来,而不被上层相框覆盖!

对于如何相框的白色部分透明,我们可以用这样的方法:首先对像框图片的每一像素进行访问,如果发现该像素是白色的,则设置其透明度为完全透明;否则,设置其透明度为完全不透明。这样就能保证白色部分完全透明。GDI+中对像素的访问是通过Bitmap对象的GetPixel()函数来实现的,GetPixel与SetPixel往往配对使用,这两个函数调用方法为:

  1. Status GetPixel( INT x, INT y, Color* color);  //获取某点的像素值  
  2.   
  3. Status SetPixel( INT x, INT y, const Color& color);//设置某点的像素值  

实现代码:

  1. void CGDIDemo_2_1View::onInsertImg(){  
  2.     Graphics graphics(this->GetDC()->m_hDC);  
  3.     int Alpha;  
  4.   
  5.     Bitmap photoframe(L"img_frame.bmp");  
  6.     Bitmap photo(L"img.bmp");  
  7.     //得到相框尺寸  
  8.     INT iWidth=photoframe.GetWidth();  
  9.     INT iHeight=photoframe.GetHeight();  
  10.   
  11.     Color color,colorTemp;  
  12.     //依次获取相框的每一个相素  
  13.     for(int iRow=0;iRow<iHeight;iRow++){  
  14.         for(int iColumn=0;iColumn<iWidth;iColumn++){  
  15.             photoframe.GetPixel(iColumn,iRow,&color);  
  16.             //如果像素为白色,设定其透明度为0  
  17.             if(color.GetR()==255&&color.GetG()==255&&color.GetB()==255){  
  18.                 Alpha=0;  
  19.             }else{  
  20.                 Alpha=255;  
  21.             }  
  22.             //重新生成新的像素点  
  23.             colorTemp.SetValue(color.MakeARGB(Alpha,color.GetR(),color.GetG(),color.GetB()));  
  24.             //重新设定相素值  
  25.             photoframe.SetPixel(iColumn,iRow,colorTemp);  
  26.         }  
  27.     }  
  28.         //进行照片与相框的合成  
  29.         //先绘制照片,然后再在照片的上面画相框,因为相框白色部分是透明的,所以会把底层的照片显示出来  
  30.         graphics.DrawImage(&photo,0,0,iWidth,iHeight);  
  31.         graphics.DrawImage(&photoframe,0,0,iWidth,iHeight);  
  32.   
  33. }  

GDI+学习之------色彩与图像

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/44414351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!