VC+DirectShow对视频进行图片处理之四
2007-03-15 21:48:55 来源:WEB开发网图像处理
在我的程序中图像处理函数是作为 DirectShow 封装类一部分的,我认为这样便于移动和使用。没有连着上面的 DirectShow 类而另外写标题是因为我觉得有必要把它提到重要位置。在程序完善阶段您的工作基本就在这里了,除了花心思构造D3D环境外几乎所有效果都要在这里实现,水平高下也体现于此。
在网上可以找到很多图像特效的代码和解说,我结合编程过程再说说。
1. 访问缓冲区的麻烦。
这是最麻烦的,二维图像在这里以一个连续的一维缓冲区呈现,您要靠一个指针去访问它,怎么办呢?先弄懂 Pitch,例如 32bit ARGB 图像,每个象素就占用 4 Byte 内存空间(1 Byte = 8 bit),对于宽度为 20 像素的图像,它的 Pitch 就是 80 Byte,即每一行占用的内存。按 x 、y 坐标就有如下公式(按 Byte 计算):
B:y * Pitch + x * 4
G:y * Pitch + x * 4 + 1
R:y * Pitch + x * 4 + 2
A:y * Pitch + x * 4 + 3
可以看出在内存中是按 BGRA 存储的,我不明白为什么这样,可能可以从计算机的内存存储方式找到答案。上述公式计算多,效率较低,在实际使用中应适时作有益的改变。
2. 浮雕。
到目前为止我在网上找到的几篇文章都说把一点的值减去其右下角点的值再加上128就行了。为什么要减去右下角的点呢?为什么要加上128呢?原来浮雕是要把图像的变化部分突出显示出来,而把相同部分淡化,所以用一点减去其邻域任意点都可以达到这个目的,倒也不一定是右下角的点,包围着它的八个点都可以,甚至可以选择减去更远的点,只要规则明确、效果好就行。在相减后点的 RGB 值都减小了,大多接近黑色,黑乎乎一片的看不出什么来,一点也不像浮雕,所以要给它们都增加一个相同的亮度,通常加上128,其它的值,例如64、100,当然也行,一切都以实际效果为准。说到效果,上面所说的RGB相减会造成浮雕有一些色点,解决方法是计算两点的亮度之差,RGB都赋值为亮度差,画面就没色点了,因为已经变成灰度图了。亮度公式是 Brightness = 0.3 * R + 0.6 * G + 0.1 * B,其中G 的比重最大,可以近似的用 G 作为亮度,在RGB各自的分量图中也可以明显看出 G 分量的图最亮,简单的把 G 的值赋给 R 和 B 就得到灰度图了,这可以减少计算,提高速度。后来我还看到这样的话句,"用3 * 3 的小块做的浮雕效果更好",不过我不知道怎么用,可能这样就可以实现 PhotoShop 那样更好的浮雕效果。
Tags:VC DirectShow 视频
编辑录入:爽爽 [复制链接] [打 印]赞助商链接