科技行者

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

知识库

知识库 安全导航

至顶网软件频道基础软件VC DirectShow对视频进行图片处理之四

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

  • 扫一扫
    分享文章到微信

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

在我的程序中图像处理函数是作为 DirectShow 封装类一部分的,我认为这样便于移动和使用.

作者:longway 来源:天极开发 2007年10月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
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 使用
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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