【问题标题】:Implementing Photoshop filters in C#在 C# 中实现 Photoshop 滤镜
【发布时间】:2009-08-18 22:41:53
【问题描述】:

我知道如何实现它们,但我不知道是逐个像素地应用转换,还是有另一种方法来影响整个图像,使用单个调用等?

AFAIK Get.Set Pixel 非常慢。我不确定他们是否这样做。

那么,如果是灰度/去饱和滤镜作为一个简单的例子,那该怎么写呢?

【问题讨论】:

标签: c# .net image bitmap photoshop


【解决方案1】:

您必须锁定图像,然后使用内存,直接绕过 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.

【讨论】:

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

为了获得更快的性能,您可能需要查看 WPF 的像素着色器效果实现,它适用于所有 .NET WPF 视觉对象,而不仅仅是图像。

看看一篇解释这种效果的一些基本实现步骤的文章:

http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html

【讨论】:

  • 谢谢,这是一个很好的例子。出于好奇,您知道像素着色器是否可以实现所有 PS 效果?我对像素着色器不太熟悉,但 AFAIK 仅适用于最简单的效果,如色移、灰度等。
  • @Joan Venge 现在,使用 WPF 4,可以实现 PS 3.0 效果,这使得编写非常复杂的效果成为可能。在shazzam-tool.com/default.html 上查看 Shazzam 像素着色器实用程序,下载最新版本,亲眼看看您可以编写的那种效果。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2018-11-03
  • 2016-01-06
  • 1970-01-01
  • 2015-12-29
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多