我知道如何实现它们,但我不知道是应用逐像素转换像素,还是有另一种方式影响整个图像,使用单个调用等?在C#中实现Photoshop过滤器#
AFAIK Get.Set Pixel非常慢。我不确定他们是否这样做。
所以,如果它是灰度/去饱和滤波器作为一个简单的情况下,将如何写它?
我知道如何实现它们,但我不知道是应用逐像素转换像素,还是有另一种方式影响整个图像,使用单个调用等?在C#中实现Photoshop过滤器#
AFAIK Get.Set Pixel非常慢。我不确定他们是否这样做。
所以,如果它是灰度/去饱和滤波器作为一个简单的情况下,将如何写它?
您必须锁定图像,然后直接绕过SetPixel方法处理内存。 See here甚至更好 here
对于examle可以将蓝色设置为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.
谢谢,我不知道锁定。锁确实是做什么的?该链接似乎没有详细描述。也许方法名称不是很具描述性? – 2009-08-18 22:52:24
也使用这种方法不得不使用不安全的代码? – 2009-08-18 22:54:31
它将内存锁定到物理位置,以便.Net内存管理器在垃圾回收期间无法移动它。是的,这使用不安全的代码,并需要适当的不安全{}部分或编译器选项。 – 2009-08-18 22:59:28
为了实现更快的性能,您可能想看看WPF的像素着色器效果的实现,可与所有.NET WPF可视对象一起使用,而不仅仅是图像。
看看一篇文章,解释了这样的效果,一些基本的实现步骤:
http://bursjootech.blogspot.com/2008/06/grayscale-effect-pixel-shader-effect-in.html
谢谢,这是一个很好的例子。出于好奇,你知道所有的PS效果都可以用像素着色器吗?我对像素着色器不太熟悉,但是AFAIK只是为了最简单的效果,比如颜色偏移,灰度,等等。 – 2011-02-02 22:06:13
@Joan Venge现在,通过WPF 4,可以实现PS 3.0效果,这使得编写非常复杂的效果成为可能。请查看http://shazzam-tool.com/default.html上的Shazzam Pixel Shader实用程序。下载最新版本并亲自体验一下你可以编写的效果。 – luvieere 2011-02-03 07:18:39
谢谢你.... – 2011-02-03 17:56:47
如果你知道如何实现它们,我倒要看看你问“我如何实施的Photoshop在C#中过滤器“,并用例子自己回答,主要是因为我很想知道如何:) – 2009-08-18 22:53:29
将它消失:) – 2009-08-18 22:55:48
http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx或http ://www.codeproject.com/KB/GDI-plus/csharpgraphicfilters11.aspx – McAden 2009-08-18 23:45:50