科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC数字图像处理编程讲座之五

VC数字图像处理编程讲座之五

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本期讲座继续介绍BMP图像特效效果。

作者:刘涛 来源:作者授权转载 2007年10月21日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
2.图像合成技术

  图像合成技术很重要,其实质是操作将两幅或两幅以上的图像,将它们的信息融合在一起,产生1+1>2的效果。我们在进行图像合成的时候可以采用Alpha值的方法,下面来看一下如何利用Alpha值来合成两张图片。

  采用Alpha图象合成的方法,就是最终合成的图象的各点像素值是由用来制作合成图的两张图片的相应点的像素值按一定比例混合而成的,这个比例由Alpha值决定,具体算式如下:

resultPixe= (pixel1*(255-Alpha)+pixel2*Alpha)/255;
// Alpha取值范围从0到255

  上面的算式中,pixel1代表图像1的当前像素点的灰度值,pixel2代表图像2的当前像素点的灰度值,Alpha可以看作两个像素在最终合成的结果中所占的权重。可以看出,只要修改Alpha的值,就可以改变合成后的图象中用来合成的两张图片各自所占的比值,改变合成后的显示效果。我们可以利用这个方法,按一定的时间间隔修改Alpha的值、这样就可以很轻易的制作出生动的淡入淡出效果、实现两幅图片间的平滑过度效果。下面给出一个制作合成图的具体源码:

BOOL CompoundImage(HANDLE HDib1,HANDLE HDib2,int alpha)
{
BYTE lpData1,lpData2;
// 源图象2的信息
//由于待合成的两个图象的格式、大小是一样的,所以我只获取一个图像文件的图像信息就可以了。
LPBITMAPINFO lpBi=(LPBITMAPINFO)HDib2;
// 计算图象数据偏移量
lpData2=(LPVOID)((LPBYTE)lpBi->bmiColors+256*sizeof(RGBQUAD));
//获取源图像2的图像数据;
lpBi=(LPBITMAPINFO)HDib1;
lpData1=(LPVOID)((LPBYTE)lpBi->bmiColors+256*sizeof(RGBQUAD));
//通过alpha值合并两张图象的像素值
for ( int i=0;i< lpBi->biWidth; i++ )
for(int j=0;j< lpBi->biHeight;j++ )
{
//套用alpha图像混合公式;
*(lpData1+i*WIDTHBYTES(lpBi->biWidth*8)+j)=(*(lpData1+i*WIDTHBYTES(lpBi->biWidth*8)+j)*(255-alpha)+ *(lpData2+i*WIDTHBYTES(lpBi->biWidth*8)+j)*alpha)/255;
}
return lpData1;
}

  以上内容我们主要是讲述了alpha图像混合的实现原理和方法,其实读者大可不必自己写这么多代码,微软给我们提供了一个名为AlphaBlend()的函数,它就可以直接实现图像合成的功能,具体怎么使用,还请读者参考MSDN。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章