我知道如何实现它们,但我不知道的是,是否逐像素地应用变换,还是有另一种方式影响整个图像,使用单个调用等?
AFAIK Get.Set Pixel非常慢。我不确定他们是否这样做过。
因此,如果将灰度/去饱和滤波器作为一个简单的情况,那么如何编写呢?
答案 0 :(得分:5)
您必须锁定图像,然后直接绕过SetPixel方法使用内存。 See here 甚至更好 here
例如,您可以将蓝色设置为255,如下所示
BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
int PixelSize=4;
for(int y=0; y<bmd.Height; y++)
{
byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);
for(int x=0; x<bmd.Width; x++)
{
row[x*PixelSize]=255;
}
} // it is copied from the last provided link.
答案 1 :(得分:1)
为了获得更快的性能,您可能需要查看WPF的Pixel Shader Effects实现,该实现适用于所有.NET WPF可视对象,而不仅仅是图像。
看一篇文章解释这种效果的一些基本实施步骤:
http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html