图像合成

原创 2004年09月18日 08:51:00

5.4 图像合成

01-9-17 下午 02:19:54


假如要实现一个动画例如一只老鼠从屏幕左边往右边跑过去,一般的书上是这么介绍的:首先做一个老鼠的画片,再画一张黑白老鼠掩模图片。首先用掩模图处理屏幕,再用掩模处理老鼠图片,最后把处理过的老鼠贴到屏幕上,前后要处理三个BitBlt函数。而且这样处理过程会使屏幕出现明显闪烁。要想制止闪烁还要先做一个兼容DC,先把屏幕图片拷贝至兼容DC,再在兼容DC上处理完老鼠后在再拷贝回屏幕。前后要用到五个BitBlt函数。图片比较小还好,若是图片很大,那速度简直就是“去年今日此电脑,人面老鼠相映红,人面不知何处去,老鼠还在慢慢爬”。是否有其他的解决方法呢?
实现透明位图的方式
1.最愚蠢的办法:直接在屏幕上逐点用SetPixel函数画图。
2.一般的方法:用BitBlt函数作至少三个运算。
3.最快的方法:直接写屏。
4.性价比最高的办法:直接写数据缓冲区。
四种方式的讨论:
1.对于初搞图像处理的程序员来说,似乎逐点画过去的办法是第一选择,然而事实证明这是世界上速度最慢的方法,用它实现的最理想的动画效果是“去年一滴相思泪,今日方流到嘴边”。
2.BitBlt:前面已介绍过,此处不再介绍。
3.直接写屏:Dos下这种方式用得比较多,在windows环境下编程,windows3.1环境下只能加挂WinG才能实现,在win95或NT下可用函数CreateDIBSection()或是使用MicroSoftDirectX函数实现。这种方式我们将出专著介绍。此处不作讨论。
4.写数据缓冲区:这个方法对环境要求较小,不需外挂软件,兼容于3.1和95、NT,速度也还可以,它的原理与直接写屏相似,而且可以方便地移植到直接写屏方式中去。我们将在此介绍此方法。
读写数据缓冲区:
大家可能还记得在前面介绍的class MYDIB,里面有两个参数,一个是bmp信息头,一个是bmp数据区,大家是否能想象得到假如修改了bmp数据区的数据,再显示图像会有什么结果?这块数据区,就是我们要使用的数据缓冲区。
透明位图
要想实现透明位图,首先要有两张图片,一张作为源位图,一张作为目的位图,程序员要把源位图贴到目的位图上,并且要指明什么颜色要屏蔽掉,为此,我们在class MYDIB上增加了一个函数Show(MYDIB* dib,int x1,int y1,int x2,int y2,int x3,int y3,BYTE r1, BYTE g1,BYTE b1,BYTE r2,BYTE g2,BYTE b2),这个函数的用法有点类似于BitBlt函数,它的意思为:把己方缓冲区内的数据拷贝到类dib的缓冲区中去,其中从RGB(r1,g1,b1)至RGB(r2,g2,b2)的颜色为透明色,x1、y1、x2、y2、x3、y3为目标坐标、拷贝范围、源坐标,其意义与BitBlt相同。在Show函数的实现过程中,我们首先算出要改变的源数据、目标数据地址,然后分析要拷贝的数据颜色是否属于屏蔽色,假如是屏蔽色,则不拷贝数据,否则拷贝。
另外一种透明位图方式
透明色固然是一种比较简单的实现方式,但是有的时候也需要另外一种实现方式,这就是直接指定颜色索引方式,我们可以指定在调色板中某某号至某某号为透明色。因此,在class MYDIB中再增加一个函数Show(MYDIB* dib,int x1,int y1,int x2,int y2,int x3,int y3,register BYTE x,register BYTE y),这个函数的原理与前一种方式差不多,只是比前一种方式少了四个参数,由以颜色指定透明色改成以颜色索引指定透明色。
透明位图的刷新速度
到底更改数据缓冲区方式的速度快,还是BitBlt速度快?要是BitBlt速度快的话,以前的一番心血岂非成了滚滚长江东逝水,为此我们要用实例分析一下,建立一个名为Tp的基于对话框的程序,加入源程序mybmp.cpp和mybmp.h,在tpdlg.h文件头中加入#include "mybmp.h",在类CTPDlg中加入两个成员变量bmp1和bmp2。在窗口初始化时设置定时器,打开文件“1.bmp”、“2.bmp”,在定时器消息响应过程中完成拷贝和刷新过程,编译并运行程序。我们可以看到一个“AllTime”参数,它显示刷新256张位图需要大约20_21秒左右。现在注释掉定时器消息响应过程中的透底函数bmp1.Show((MYDIB*)&bmp2,0,0,640,480,0,0, 0,0,0,i,i,i),再看刷新256张位图大约需要15_16秒,这是单纯使用函数StretchDIBits所需的时间。可见此处一个透明位图完成时间相当于一点四个BitBlt时间,比照BitBlt方式的三个BitBlt时间(差效果)、五个BitBlt时间(好效果)要好得多。当然,这与直接写屏比又差得多了。
现在再将透底函数换成bmp1.Show((MYDIB*)&bmp2,0,0,640,480,0,0, 0,i),我们不由惊喜地看到现在刷新256张位图的时间为16_17秒,几乎可以认为,缓冲区读写时间已经可以忽略不计。
01_9_17_53.GIF

图5.3
实例分析
在这个实例中,我们要实现一个动画,背景是一位绝代佳人,前面有一只狗牵着它的宠物跑来跑去。素材需要五张图片,其中背景一张,动画四张。我们分析一下它的实现方式:
在类CMovieDlg中,我们首先用语句BMP bmp[5]定义了五张图片,然后用语句MYDIB temp定义了一个临时图片。在对话框初始化过程函数中分别读入五张位图,设定定时器为一百毫秒,在定时器响应函数中操作过程如下:首先将背景写入临时图片,再将小狗透去白色写入临时图片,最后将临时图片写上屏幕。
01_9_17_54.GIF

图5.4

图像纹理合成

关于纹理合成最经典的论文应该就数Efros的Texture Synthesis by Non-parametric Sampling这篇论文了,引用量近2000。 这里的合成是基于样例的,就...
  • wangguoqingcumt
  • wangguoqingcumt
  • 2015年06月09日 23:12
  • 660

基于ENVI的图像融合+波段合成

最近研究了图像融合的相关内容,学会了一种在ENVI软件上实现的融合多光谱图像和全色图像(高分辨图像)的方法,现在总结流程如下:  1、打开ENVI软件,这里所用的是ENVI5.1版本    2、...
  • qq_35040828
  • qq_35040828
  • 2016年12月28日 21:28
  • 6668

Matlab 小程序 yuv图片融合

要求: 将320*200的android.bmp图片中的rgb数据转换为4:2:0格式的yuv数据,再与另一个720x576,4:2:0格式图片horseriding.yuv数据进行融合(y...
  • AmazingUU
  • AmazingUU
  • 2016年10月15日 22:12
  • 1303

OpenCV两张图片的合并

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV两张图片的合并      原理:        两张图片合并,想想图片是用一个个像素点来存储,每个...
  • u013035103
  • u013035103
  • 2014年08月09日 15:13
  • 6584

OpenCV实现任意大小图片的合并

OpenCV实现图像合并主要有两种方法 方法一:使用Mat.push_back方法将列数相同的图像加到最后一行 方法二: 主要思路是将图像拷贝到待合并图像的感兴趣区域 (1)新建一个要合并...
  • ktigerhero3
  • ktigerhero3
  • 2016年11月09日 20:21
  • 2551

SurfaceFlinger中图像合成流程

android中图像的显示是通过HWComposer合成的,(不支持硬件composer的不考虑,现在基本都支持)。 硬件支持合成就是你输入多路视频,图像信号,出来一路合成好的数据。 硬件合成只支持...
  • u014409795
  • u014409795
  • 2016年05月09日 17:20
  • 737

【python图像处理】两幅图像的合成一幅图像(blending two images)

将两幅图像合成一幅图像,是图像处理中常用的一种操作,python图像处理库PIL中提供了多种种将两幅图像合成一幅图像的接口。...
  • guduruyu
  • guduruyu
  • 2017年05月09日 10:27
  • 2857

python opencv 将两张图片融合

本节实现的是使用OpenCV里自带的函数,将两幅图片按照特定的比例融合。
  • huanglu_thu13
  • huanglu_thu13
  • 2016年08月28日 16:08
  • 6614

java合成图片

import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.aw...
  • shiyuezhong
  • shiyuezhong
  • 2016年12月02日 09:15
  • 676

根据图像金字塔合成图像

图像金字塔中可以生成不同分辨率的图像,本文介绍如何利用图像金字塔的图像生成一幅图像。...
  • qq_30401249
  • qq_30401249
  • 2016年06月20日 16:31
  • 277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像合成
举报原因:
原因补充:

(最多只允许输入30个字)