2013-01-07 31 views
7

我試圖模擬一個data Photo,不知道爲圖像數據使用什麼類型:Haskell中用於內存中圖像數據的類型是什麼?

> data Photo = 
> Photo 
> { photoUploaderId :: AccountId 
> , photoWidth :: Int 
> , photoHeight :: Int 
> , photoData :: ByteString 
> } 

我使用Data.ByteString這裏。有沒有更好的選擇?

背景:我要去的圖像數據存儲在數據庫中,並檢索和發送它通過網絡連接。在第一次將照片插入數據庫時​​,我可能需要操縱它,比如縮放等。

回答

10

如果您要訪問任意像素的照片,請使用unboxed array。它會給你O(1)索引和最小的空間開銷。 UArray (Int, Int) Word32應該是你在找什麼。請記住,unboxed數組是嚴格的。如果你正在尋找非嚴格使用Array,但請記住,像素值將盒裝這會降低性能。

另一種類型的類似的功能和值得考慮的是vectors。另一方面,如果你是而不是去操縱像素,你會將圖像當作blob來對待,ByteString是一個不錯的選擇。這就是它所設計的:二進制數據的斑點。

總結:使用ArrayVector進行操作,存儲和傳輸爲ByteString

+0

感謝。如果我只需要通過網絡連接發送圖像數據怎麼辦?我不會自己操縱像素。 –

+0

是的,我想大多數情況下我只需要一個blob。 :-) –

6

一般來說,UArray是一個不錯的選擇。這取決於照片格式,您將如何閱讀圖像以及您使用何種處理方式。我發現Codec.Image.DevIL庫對照片處理非常方便。以下是將JPEG圖像轉換爲PNG的示例。

import Codec.Image.DevIL 

main = do 
    ilInit 
    img <- readImage "test.jpeg" 
    writeImage "test.png" img 

readImage函數有這個簽名。並且它返回RGBA數組。指數是(行,列,顏色通道)。因此,如果您要使用該庫,IO (UArray (Int, Int, Int) Word8)將是一個不錯的選擇。

+0

謝謝。我用更詳細的背景更新了我的問題。如果從數據庫中檢索圖像數據,我可以使用Codec.Image.DevIL嗎? –

+0

它看起來像Codec.Image.DevIL只支持從文件讀取,所以我不認爲你可以使用它從數據庫中讀取。 – mhwombat

+0

謝謝。 +1讓我知道這樣一個好lib :-D –

相關問題