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不保证资料的完整性。
2/2 首页 上一页 1 2 |