AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

VC+DirectShow对视频进行图片处理之四

51自学网 2015-08-30 http://www.wanshiok.com

 

  5. 马赛克

  马赛克效果就是把图像分解成 m * n 个小块 或长宽为 x 、y 的小块,用小块内的某点颜色作为整块的颜色,通常用左上角的颜色。

  动起手编程会很麻烦,要定位到每小块的左上角,才能改变块内的颜色,因此要用很多循环,我在代码中就用了12个循环!除此,还有逻辑麻烦,拿分成宽高为 x、y 的小块这种情况为例,您不能保证图像的长宽刚好都是 x、y的倍数,很多时会余出一些"边角料",这就是麻烦,不可能舍弃它们不进行处理,因为很影响效果。因此如图所示,要先处理蓝色的倍数部分,再处理绿色的宽度上余下部分,处理红色的高度上余下部分,还有黄色的宽高夹缝的小块。


  除了这种长方形的处理,还可以试验上面右图菱形等形状,当然,您要付出很大的劳动,而我没能做到这些。

  6. MMX

  记得在上面我说过会在文章中涉及一点MMX,不妨在这里涉及。在 VC 中可以镶入汇编使汇编变得很容易,完全不是纯汇编代码所能相比的,所以不用怕汇编,可以先用 C 语言写出实现代码,再用汇编"翻译"过来。如果译不出来,更加可以把代码中断一下,让 VC 反汇编,看 VC 的汇编代码,再行改进,为什么不行呢,有人用枪指着您么?记住哦,如果没办法改进就放弃汇编,不要做多余的事。其实要用 MMX 也不一定非用汇编不可,VC 也提供了 MMX 的 C++ 封装,学习后可用它,我则懒于学习。

  MMX 最大的好处是可以自动保证处理的值范围为0 ~ 255,节省判断,而且MMX寄存器是64位的,一次可处理32bit图像的两个点。其它的我也不太懂,您可参考相关资料。

  下面列出浮雕效果代码,它是减去右边点的,由于不进行行列判断,每行最后一点减去的是下一行的首点。

__int64 Mask = 0x8080808080808080; // 0x80 = 128,就是亮度的增加值
UINT a = bmpBufferLen >> 3; // 缓冲区长度(按 BYTE 计算)除以 8(两个点的大小),计算要循环的次数
_asm{
mov esi,pIn; // 要处理的缓冲区指针
mov edi,pOut; // 结果缓冲区指针
mov eax,a; // 循环次数
dec eax; // 循环次数减一,因为最后两点没法减,可以在后面特殊处理,这里不作处理
movq mm1,Mask; // 增加值,movq 是 MMX 的专用汇编指令,请找资料看
_loop: // 循环
mov ecx,esi; // ecx 存储右边点的指针
add ecx,4; // 只加 4 就跳过一点到右边点了
movq mm0,[esi]; // 移动要处理的两点的值到 MMX 寄存器
movq mm2,[ecx]; // 移右边两点的值
psubusb mm0,mm2; // 相减
paddusb mm0,mm1; // 加上增加值
movq [edi],mm0; // 移到结果缓冲区
add esi,8; // 移动到下两点
add edi,8; // 同上
dec eax; // 循环计数减一
jnz _loop; // 不为零就继续循环
emms; // 结束 MMX 使用
}

 

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:学好VC++的十大良好习惯  下一篇:VC+DirectShow对视频进行图片处理之五