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往往配对使用,这两个函数调用方法为:

[cpp] view
plain
copy

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

实现代码:

[cpp] view
plain
copy

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

GDI+学习之------色彩与图像的相关文章

GDI+学习笔记(七)保存简单图像

请尊重本人的工作成果,转载请留言,并说明转载地址,谢谢.地址如下: http://blog.csdn.net/fukainankai/article/details/27710883 前几节中,我们利用GDI+在窗口中绘制了各种各样的图形.图像,这一节,我们将会将这些图像保存成简单图像.所谓简单图像,指的是bmp/jpg/png等图像或者单帧的gif图像.保存成多帧的gif图像稍微复杂一点,本节中暂时不做说明.保存成动态的tiff文件也比较简单,但这里也不做说明,下次有机会和gif一起介绍. 另

色彩及图像基础(一)

色彩及图像基础(一) 学习时间:2014.04.30 学到了-- 1. 色光的基色或原色为红(R).绿(G).蓝(B)三色. 2. 互补色是指两种颜色的光相混合能够形成白光.互补色是彼此之间最不一样的颜色,这就是人眼能看到除了基色之外其它色的原因. 3. 色彩空间:RGB色彩空间.HIS色彩空间.YUV色彩空间和CMY色彩空间.每种色彩空间都有相应的优势. HSI色彩空间: 1. 相对于RGB色彩空间,更适合于人的视觉. 2. 用色调(Hue).色饱和度(Saturation或Chroma)和亮

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

色彩及图像基础(三)

色彩及图像基础(三) 学习时间:2014.04.30 学到了-- 1. 图像压缩的基础在于: ①原始图像信息存在着很大的冗余度: ②人眼对图像的亮度信息敏感.对颜色分辨率弱. 2. 数据压缩的两类基本方法: ①无损压缩:将相同的或相似的数据或数据特征归类,使用较少的数据量描述原始数据,达到减少数据量的目的. ②有损压缩:利用人眼的视觉特性有针对性地简化不重要的数据,以减少总的数据量. 3. 图像的编码方法:行程编码.增量调制编码和霍夫曼编码. 行程编码: 1. RLE(Run-Length En

色彩及图像基础(二)

色彩及图像基础(二) 学习时间:2014.04.30 学到了-- 1. 图形分为矢量图和位图. 2. 矢量图(vector - based image),是用一系列计算机指令来描述和记录一幅图,这幅图可分解为一系列子图如点.线.面等. 3. 位图(bit-mapped image),是用像素点来描述或映射的图,也即位映射图.位图在内存中也就是一组计算机内存地址位(bit)组成,这些位定义图像中每个像素点的颜色和亮度.位图一般也称为图像. 4. 矢量图和位图的比较: 5. 图像分辨率:DPI(do

GDI+学习笔记(六)渐变画刷

画刷,顾名思义,就是像画刷一样,向设备上绘制,还记得小时候常唱的首歌,"我是一个粉刷匠.." 好吧,跑题了. 本系列博客希望尽可能简单的描述每项功能,而不希望把每个参数都介绍的详详细细,如果需要,请查阅msdn,本节讲述的渐变画刷,主要有两种,一种是叫线性画刷(LinearGradientBrush),还有一种叫路径画刷(PathGradientBrush),我希望以一种尽可能简单的方式去描述它,但能力有限,所以有什么意见,希望各位能帮忙提出,谢谢. (一)使用画刷 上一节中,我们实际

[Android学习系列20]图形图像的一些事

参考: android图形系统详解一:Canvas android图形系统详解二:Drawables android图形系统详解三:形状Drawable和九宫格 android图形系统详解四:控制硬加速 android图形系统详解五:Android绘制模式 android图形系统详解六:View layer[Android学习系列20]图形图像的一些事,码迷,mamicode.com

GDI+学习笔记(五)绘制一个正方体

本文将介绍如何利用GDI+绘制一个正方体. (一)准备阶段 想象一下,高中的时候,我们在学立体几何的时候是怎样画一个正方体的,我们在一张纸上利用投影的思路将其绘制在一张纸上,对吧,这计算投影的部分,我们暂且忽略.下图是我用windows的画图绘制的一个正方体: 我们计算出这些点在平面上的坐标如下: Point A(100,200); Point B(200,200); Point C(100,300); Point D(200,300); Point E(100+50*1.414, 200-50

C# GDI+学习笔记1

?前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTest_Article1_161112_2346.rar 如果有什么疑问,或者建议,请留言联系本人. 1 窗口重绘 ?Windows自动处理鼠标拖动窗体.更改窗体大小等用户操作,自动调整窗体所占屏幕区域的大小,并进行重画 当需要重画时,Windows发送消息WM_PAINT 窗体对象的Paint事件用于