2013-11-20 38 views
1

我正在使用c#(帶有Adobe Photoshop Object Library)的Photoshop插件。我試圖遍歷活動文檔中的所有像素,但是使用代碼我現在需要很長時間才能通過256x256文件中的一行像素。我想知道是否有比使用ColorSampler更好(更快)的方式?獲取像素顏色的快速方法?

這是我現在有(C++插件?): (http://forums.adobe.com/thread/290211) (C# Equivalent to this code

static void Main(string[] args) 
{ 
    ps.Application app = new ps.Application(); 
    app.Preferences.RulerUnits = ps.PsUnits.psPixels; 

    ps.Document activeDoc = app.ActiveDocument; 

    double docWidth = activeDoc.Width; 
    double docHeight = activeDoc.Height; 
    double xPos = 0.0D; 
    double yPos = 0.0D;    

    activeDoc.ColorSamplers.RemoveAll(); 
    var pixelLoc = new object[] { 0.0D, 0.0D }; 
    ps.ColorSampler myColorSampler = activeDoc.ColorSamplers.Add(pixelLoc); 

    var stopwatch = Stopwatch.StartNew(); 

    ps.SolidColor myColor; 
    double red; 
    double green; 
    double blue; 

    for (xPos = 0.0D; xPos <=docWidth - 1; xPos++) 
    { 
     myColor = myColorSampler.Color; 
     red = myColor.RGB.Red; 
     green = myColor.RGB.Green; 
     blue = myColor.RGB.Blue; 
     pixelLoc[0] = xPos; 
     myColorSampler.Move(pixelLoc); 
    } 

    Console.WriteLine(stopwatch.ElapsedMilliseconds); //11000 ms for 1 row of 256 pixels 


    Console.ReadLine(); 
} 
+0

你是否在for循環中聲明變量?這可能是問題的一部分... –

+0

謝謝!我已經將它們從for循環中移出來了,它確實加快了一點(現在是11000ms - 13000ms之前),我編輯了我的原始文章。但它仍然非常慢... – VincentC

+0

我會假設循環本身是相當快的,所以必須有內部的東西導致它慢 - 也許使用秒錶來分析每個顏色調用。我還注意到,你每次都調用myColor.RGB - 一旦有變化就將它存儲在一個變量中?您也可以嘗試使用Parallel.For以線程方式運行循環:) – GracelessROB

回答

3

我還沒有這個API合作過,但我發現這個網站:Adobe Photoshop CS5 Object Library

我做了一些看,並有一個SaveAs方法,可以在文檔對象上使用。您可以使用此方法將文檔保存爲圖像(比方說BITMAP)。

從那裏,您可以在線使用多個來源,顯示如何從BMP中快速提取像素信息。

這是一個特別的文章:Work with Bitmaps faster in C#

我認識到,我不提供您使用拷貝/ pasteable代碼,但我希望這點你在正確的方向。

+0

謝謝!我試過這個,我認爲這可能是現在最好的解決方案。只需要約100毫秒即可保存4096x4096位圖文件!我只是想知道是否可以知道是否有辦法跳過寫入HDD部分(我可以將它保存到MemoryStream中)。我現在需要先將它保存到硬盤,然後再讀回,這似乎可以避免嗎? – VincentC

+0

我很高興這有幫助。看起來,保存到磁盤是SaveAs實現的一部分,所以除非找到使用SaveAs的替代方法,否則可能沒有辦法。理想情況下,最好的方法是在一次調用中從活動文檔中獲取一組數據,但我沒有看到類似的東西。 –