2009-11-14 77 views
1

我遇到了一個不喜歡PIL的嵌入式64位Python實例的問題。在我開始花費更多的方法來讓編譯的圖像編輯器爲我讀取像素(例如ImageMagick)之前,我希望這裏的任何人都可以想到一個純粹的Python解決方案,它的速度與編譯後的對應物速度相當。閱讀PNG像素的Alpha。通過純Python的快速方法?

現在我意識到編譯好的朋友總是會快很多,但我希望因爲我「只是」想讀取一組像素的alpha值,或許夠快純Python解決方案可以變出來。任何人有任何明智的想法?

雖然,我已經試過PyPNG,那是遠太太慢了,所以我不期待任何魔術解決方案。無論如何,我不得不問。

感謝任何回覆!

僅供參考,我將閱讀的圖像平均大約爲512 * 512至2048 * 2048,我將從任意位置讀取一個像素到所有像素(乘以幾百萬時間,但值可以存儲,因此讀取兩次沒有完成)。

回答

2

從PNG獲取數據需要解壓縮數據並對其進行解壓縮。對於您的應用程序,這些在Python中可能會太慢。一種可能性是從PyPNG開始,擺脫它不需要的任何東西。例如,它可能會存儲從PNG中讀取的所有數據,並且您看到的某些速度較慢可能是由於內存分配造成的。

+0

是的,那是關於我的想法。我不得不在暗中刺傷,然後問它:) 感謝您的評論! – 2009-11-15 20:23:47

0

當你說PyPNG太慢,它有多慢?換句話說,速度有多快會足夠快? PyPNG不會做任何愚蠢的事情來讓自己變得緩慢,但它是用Python編寫的。

請確保您使用read()按行逐行讀取圖像,並確保您正在使用row [3 :: 4]提取alpha通道。通過使用切片符號來提取Alpha通道不會比讀取整個圖像慢。

我添加了一些notes to the PyPNG documentation about its speed

+0

特別是:解壓縮使用zlib模塊,該模塊使用C語言和快速; PyPNG不會將整個圖像存儲在內存中,除非它具有,它通常將圖像逐行處理。 – 2010-01-05 11:25:18

+1

我已經使用它一段時間了,但是想到這樣,我終於想出瞭如何讓PIL與嵌入式情況一起工作,最終的結果是PIL,即使是定製編譯模塊,仍然有點兒慢。並不是說它本身就很慢,它所做的事情等等。只是在最終用戶所看到的情況下放慢速度,而不是什麼「現實」可能。因此,在「*如果PIL速度提高5倍*會很好」的情況下,PyPNG無法競爭。 同樣,我不希望PyPNG在這種情況下進行比較,我只是在解釋「足夠快」在這裏。 :) – 2010-01-06 13:37:06