zoukankan      html  css  js  c++  java
  • GDI+学习之------色彩与图像

    色彩

    在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. }  
  • 相关阅读:
    C#反射(一)
    找回密码
    常用的webservice接口 .
    C# 反射应用技术
    Delphi简介
    C#程序思想简介
    如何跨线程访问window控件
    C#如何判断某个文件夹是否为共享,访问权限为只读
    Delphi基础
    Web Service接口
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7145827.html
Copyright © 2011-2022 走看看