色彩

在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. 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. 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. }

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

  1. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...

  2. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  3. 使用GDI+显示OpenCV中的图像IplImage

    OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...

  4. OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)

    1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...

  5. OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...

  6. C# GDI+学习笔记1

    —前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...

  7. GDI+学习---2.GDI+编程模式及组成类

    在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(paramet ...

  8. OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...

  9. 学习 opencv---(3) ROI 区域图像叠加&初级图像混合

    在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操 ...

随机推荐

  1. 使用GCD验证码倒计时

    __block int timeout = 60; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY ...

  2. 二次封装OKHttp网络框架(1)

    1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...

  3. jQuery——stop

    为什么要停止动画? 对同一个元素,如果拥有一个以上的动画对其加以作用,那么后面的动画会被放入一个动画队列中.动画队列的动画是在其上一个动画完成以后才会执行. 控制两个参数四种情况 1.第一个参数表示后 ...

  4. CSS——行业动态demo

    1.padding的运用:子div继承父div的宽,子div的padding-left值是不会撑大的. 2.背景图片的运用:不平铺.定位 3.ul本身就是一个盒子,它的高度是li中的字体的默认高度撑起 ...

  5. 如何在Linuxt系统下运行maven项目

    如何在Linuxt系统下运行maven项目 我们知道现在利用MAVEN来管理JAVA项目是非常常见的.比如公司一般都有一个自己的MAVEN仓库,通过MAVEN仓库来解决我们的项目依赖,更加方便的构建项 ...

  6. [Windows Server 2012] 杰奇CMS安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:JIEQI ...

  7. JAVA和JVM运行原理揭秘

    这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器 ...

  8. ProE常用曲线方程:Python Matplotlib 版本代码(蝴蝶曲线)

    花纹的生成可以使用贴图的方式,同样也可以使用方程,本文列出了几种常用曲线的方程式,以取代贴图方式完成特定花纹的生成. 注意极坐标的使用................. 前面部分基础资料,参考:Pyt ...

  9. Android Binder机制(一) Binder的设计和框架

    这是关于Android中Binder机制的一系列纯技术贴.花了一个多礼拜的时间,才终于将其整理完毕.行文于此,以做记录:也是将自己所得与大家分享.和以往一样,介绍Binder时,先讲解框架,然后再从设 ...

  10. 太坑了,mybatis注解一对多,id没了

    @Select("SELECT *, id nodes FROM QUESTION_PO WHERE ID=#{id}") @Results({ @Result(property ...