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往往配对使用,这两个函数调用方法为:
- Status GetPixel( INT x, INT y, Color* color); //获取某点的像素值
- Status SetPixel( INT x, INT y, const Color& color);//设置某点的像素值
实现代码:
- void CGDIDemo_2_1View::onInsertImg(){
- Graphics graphics(this->GetDC()->m_hDC);
- int Alpha;
- Bitmap photoframe(L"img_frame.bmp");
- Bitmap photo(L"img.bmp");
- //得到相框尺寸
- INT iWidth=photoframe.GetWidth();
- INT iHeight=photoframe.GetHeight();
- Color color,colorTemp;
- //依次获取相框的每个相素
- for(int iRow=0;iRow<iHeight;iRow++){
- for(int iColumn=0;iColumn<iWidth;iColumn++){
- photoframe.GetPixel(iColumn,iRow,&color);
- //假设像素为白色。设定其透明度为0
- if(color.GetR()==255&&color.GetG()==255&&color.GetB()==255){
- Alpha=0;
- }else{
- Alpha=255;
- }
- //又一次生成新的像素点
- colorTemp.SetValue(color.MakeARGB(Alpha,color.GetR(),color.GetG(),color.GetB()));
- //又一次设定相素值
- photoframe.SetPixel(iColumn,iRow,colorTemp);
- }
- }
- //进行照片与相框的合成
- //先绘制照片,然后再在照片的上面画相框,由于相框白色部分是透明的,所以会把底层的照片显示出来
- graphics.DrawImage(&photo,0,0,iWidth,iHeight);
- graphics.DrawImage(&photoframe,0,0,iWidth,iHeight);
- }
GDI+学习之------色彩与图像的更多相关文章
- OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- 使用GDI+显示OpenCV中的图像IplImage
OpenCV虽然自带了轻量级的界面库HighGUI,但是支持的图像化元素实在是太少了,一般只在前期算法测试时使用.实际产品还是使用MFC库.因此本文记录了如何在GDI+中显示OpenCV中的IplIm ...
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...
- OpenCV计算机视觉学习(13)——图像特征点检测(Harris角点检测,sift算法)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 前言 ...
- C# GDI+学习笔记1
前言 本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙.但本文主要是让大家简单的回顾一下GDI+的基本概念.本篇文章的参考代码请在此下载 . GDIPTes ...
- GDI+学习---2.GDI+编程模式及组成类
在使用GDI+的时候,您不必像在GDI中那样关心设备场景句柄,只需简单地创建一个Graphics对象,然后以您熟悉的面向对象的方式(如myGraphicsObject.DrawLine(paramet ...
- OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...
- 学习 opencv---(3) ROI 区域图像叠加&初级图像混合
在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操 ...
随机推荐
- Java中的异常注意点
在java中 使用throw关键字抛出异常 使用throws关键字声明异常 public static void main(String[] args) throws Exception{ ...
- reactnative(2) - Navigator 使用案例
'use strict'; import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet ...
- B树、B+树、红黑树、AVL树比较
B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由 ...
- [ ZJOI 2006 ] Mahjong
\(\\\) \(Description\) 现有权值分别为\(1\text~100\)的\(100\)种牌,分别给出每种排的张数\(A_i\),试判断能否胡牌,胡牌需要将所有牌不重不漏地分成以下几类 ...
- P1968 美元汇率
题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...
- Html常用标签及全称
<!-- 块标签 divsion --><div></div> <!--br 换行 break--> <br /> <!--分割 ...
- StackOverflowError&OutOfMemoryError区别
在Java虚拟机规范中,针对内存分配规定两种异常状况,即StackOverflowError和OutOfMemoryError. StackOverflowError:当线程请求的内存大小大于所配置的 ...
- DataTable And DataRow
/// <summary> /// 将DataTable的字段名全部翻译为中文 /// </summary> /// <param name="table&qu ...
- Element type "LinearLayout" must be followed by either attribute specifications, ">" or "/>"的解决办法
看老师的word文档开始学习.复制了一段代码,在layout中新建了一个Android XML file,发现有提示错误. 代码如下: <?xml version="1.0" ...
- TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具
怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...