我知道如何实现它们,但我不知道是逐个像素地应用转换,还是有另一种方法来影响整个图像,使用单个调用等?
AFAIK Get.Set Pixel 非常慢。我不确定他们是否这样做。
因此,如果将灰度/去饱和过滤器作为一个简单的案例,人们会怎么写呢?
您必须锁定图像,然后使用内存,直接绕过 SetPixel 方法。 看这里或者更好看这里。
例如,您可以将蓝色通道设置为 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.
为了获得更快的性能,您可能需要查看 WPF 的像素着色器效果实现,它适用于所有 .NET WPF 视觉对象,而不仅仅是图像。
看看一篇文章,解释了这种效果的一些基本实现步骤:
http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html