在C#中实现Photoshop滤镜

3
我知道如何实现它们,但我不知道是逐像素应用转换还是有其他方法可以使用单个调用等方式影响整个图像?
据我所知,Get.Set Pixel非常慢。我不确定他们是否是这样做的。
因此,如果将灰度/去饱和滤镜作为简单情况,该如何编写代码呢?

1
如果您知道如何实现它们,我想请您问一下“如何在C#中实现Photoshop滤镜”,并用示例自己进行回答,主要是因为我很想知道如何做到这一点 :) - Allen Rice
1
请访问以下网址以获取与编程有关的内容:http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx或者http://www.codeproject.com/KB/GDI-plus/csharpgraphicfilters11.aspx - McAden
@JoanVenge,你是否也实现了Photoshop的木偶滤镜?如果是,请告诉我如何操作。 - user3751794
2个回答

5

您需要锁定图像,然后直接绕过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.

谢谢,我不知道锁定。锁定到底是做什么的?链接似乎没有详细描述。也许方法名称不太具有描述性? - Joan Venge
1
它将内存锁定到物理位置,这样.Net内存管理器在垃圾回收期间无法移动它。是的,这需要使用不安全代码并需要适当的unsafe{}部分或编译器选项。 - Eric J.
1
@Joan:使用LockBits确实需要unsafe关键字。通常这并不是什么问题,但有些Windows用户可能在安全策略下运行,禁止使用不安全的代码,因此您的应用程序将无法工作。我自己从未遇到过这个问题,但它的威胁让我完全放弃了使用位图。 :( - MusiGenesis

1

谢谢,这是一个很好的例子。出于好奇,您知道所有PS效果是否都可以使用像素着色器实现吗?我对像素着色器不太熟悉,但据我所知,它仅适用于最简单的效果,如颜色转换、灰度等。 - Joan Venge
1
@Joan Venge,现在有了WPF4,可以实现PS3.0效果,这使得编写非常复杂的效果成为可能。请访问http://shazzam-tool.com/default.html并下载最新版本的Shazzam像素着色器工具,亲自体验一下你可以编写出的各种效果。 - luvieere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接