2009-08-18 66 views
3

我知道如何實現它們,但我不知道是應用逐像素轉換像素,還是有另一種方式影響整個圖像,使用單個調用等?在C#中實現Photoshop過濾器#

AFAIK Get.Set Pixel非常慢。我不確定他們是否這樣做。

所以,如果它是灰度/去飽和濾波器作爲一個簡單的情況下,將如何寫它?

+1

如果你知道如何實現它們,我倒要看看你問「我如何實施的Photoshop在C#中過濾器「,並用例子自己回答,主要是因爲我很想知道如何:) – 2009-08-18 22:53:29

+0

將它消失:) – 2009-08-18 22:55:48

+1

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

回答

5

您必須鎖定圖像,然後直接繞過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. 
+0

謝謝,我不知道鎖定。鎖確實是做什麼的?該鏈接似乎沒有詳細描述。也許方法名稱不是很具描述性? – 2009-08-18 22:52:24

+0

也使用這種方法不得不使用不安全的代碼? – 2009-08-18 22:54:31

+1

它將內存鎖定到物理位置,以便.Net內存管理器在垃圾回收期間無法移動它。是的,這使用不安全的代碼,並需要適當的不安全{}部分或編譯器選項。 – 2009-08-18 22:59:28

1

爲了實現更快的性能,您可能想看看WPF的像素着色器效果的實現,可與所有.NET WPF可視對象一起使用,而不僅僅是圖像。

看看一篇文章,解釋了這樣的效果,一些基本的實現步驟:

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

+0

謝謝,這是一個很好的例子。出於好奇,你知道所有的PS效果都可以用像素着色器嗎?我對像素着色器不太熟悉,但是AFAIK只是爲了最簡單的效果,比如顏色偏移,灰度,等等。 – 2011-02-02 22:06:13

+1

@Joan Venge現在,通過WPF 4,可以實現PS 3.0效果,這使得編寫非常複雜的效果成爲可能。請查看http://shazzam-tool.com/default.html上的Shazzam Pixel Shader實用程序。下載最新版本並親自體驗一下你可以編寫的效果。 – luvieere 2011-02-03 07:18:39

+0

謝謝你.... – 2011-02-03 17:56:47