设为首页 加入收藏

TOP

1.5.4 图像的渐进显示
2013-10-07 00:23:37 来源: 作者: 【 】 浏览:62
Tags:1.5.4 图像 渐进 显示

1.5.4  图像的渐进显示

图像渐进显示的思路是先记录下图像的每个像素点的灰度值,显示的时候先将屏幕置黑,将循环显示图像n次,这里设n为0,1,2,…,256。每一次显示像素灰度值的n/256倍,图像的像素点计算一遍后,显示一次,重复执行上述过程,直至每一个屏幕上的像素点的灰度值恢复到原始图像灰度值的水平。渐进显示特效虽然不需要对图像进行分块,但是需要开辟两块内存空间,一块用来存储图像的原始灰度值,另一块用来存储每次计算后的像素灰度值。

/********************************************
******************************
*函数名:
*    FadeIn(CDC *pDC)
*
*函数参数:
*    CDC *pDC-指向设备环境的指针,用于显示位图数据
*
*返回值:
*    无
*
*说明:该函数实现了图像的渐进显示的效果
**********************************************
****************************/
void SpecialEffectShow::FadeIn(CDC *pDC)
{
int bitmapWidth=GetDimensions().cx;//获得源图像
的宽度,以像素为单位
int bitmapHeight=GetDimensions().cy;//获得源图像
的高度,以像素为单位
 CRect rect(0,0,bitmapWidth,bitmapHeight);//以源
图像的尺寸创建一个矩形
CBrush brush(RGB(0,0,0)); //设置画刷为黑色
pDC->FillRect(&rect,&brush);//将已经显示出来的原
图像重新设置成黑色,达到刷新屏幕的效果
 LPBITMAPINFO pBitmapInfo=(BITMAPINFO*)m_lpBmpInfoHead;
//为适应StretchDIBits函数的需要,将图像信息头指针
强制转换为LPBITMAPINFO类型
  
int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4;//
每行像素所占字节数,必须为4的倍数
LPBYTE temp =new BYTE[bitmapHeight*lineByte];//
在堆上分配内存存储临时图像数据
memset (temp,0,bitmapHeight*lineByte);//初始置零
 for(int m=0;m<256;m++)
{
for(int j = 0; j < bitmapHeight; j++)
{
for(int i = 0; i < lineByte; i ++)
temp[j*lineByte+i]=m_pImgData[j*lineByte+i]
*m/256;//将每像素灰度值设置为原始值的m/256倍大小
}
::StretchDIBits(pDC->GetSafeHdc(),
0, 0, bitmapWidth, bitmapHeight,
0, 0, bitmapWidth, bitmapHeight,
temp, pBitmapInfo,DIB_RGB_COLORS, SRCCOPY);
Sleep(3);//设置延时时间
}
delete [] temp;//释放堆上分配的内存
}

在视图类CChap1_6View中映射“渐进显示”菜单事件处理函数OnFadeIn(),该函数的实现过程与前面“扫描显示”菜单事件处理函数CChap1_6View::OnScan()相类似,限于篇幅,此处不赘述,感兴趣的读者可以运行程序,查阅相关代码。程序运行时,点击“渐进显示”菜单,效果如图1-27所示。

错误!

 
(点击查看大图)图1-27  渐进显示的效果

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.5.3 图像的滑动显示 下一篇1.5.2 图像的扫描显示

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: