2013-01-07 7 views
7

私はdata Photoをモデル化しようとすると、画像データの種類を使用するように思ったんだけど:ハスケルのメモリ内画像データにはどのようなタイプを使用しますか?

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

私はここにData.ByteStringを使用しています。それ以上の選択肢はありますか?

背景:イメージデータをデータベースに格納し、ネットワーク接続経由​​で取得して送信します。初めてデータベースに写真を挿入すると、スケーリングなどのように少し操作する必要があるかもしれません。

答えて

10

写真の任意のピクセルにアクセスする場合は、unboxed arrayを使用してください。 O(1)の索引付けと最小限のスペースオーバーヘッドを提供します。 UArray (Int, Int) Word32はあなたが探しているものでなければなりません。ボックス化されていない配列は厳密であることを思い出してください。非厳密性を求める場合はArrayを使用しますが、ピクセル値はボックス化されてパフォーマンスが低下することに注意してください。

同様の機能と考慮する価値のあるタイプの別のタイプは、vectorsです。

ではなく、ピクセルを操作する場合は、イメージをブロブとして扱うので、ByteStringは良い選択です。これは、バイナリデータのブロブのために設計されたものです。

要約:またはVectorのいずれかを使用して操作し、ByteStringとして保存および転送します。

+0

ありがとうございました。ネットワーク接続を介して画像データを送信するだけでよい場合はどうすればよいですか?私は自分でピクセルを操作するつもりはありません。 –

+0

ええ、私はたいてい、ほんの一塊しか必要ないと思う。 :-) –

6

一般に、UArrayは良い選択です。それは、写真の形式、画像の読み方、そしてどのような処理をするかによって異なります。私はCodec.Image.DevILライブラリが写真処理に便利だと思っています。ここでは、JPEG画像をPNGに変換する例を示します。

import Codec.Image.DevIL 

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

readImage関数にはこのシグネチャがあります。

readImage :: FilePath -> IO (UArray (Int, Int, Int) Word8) 

そして、RGBA配列を返します。インデックスは(行、列、カラーチャネル)です。したがって、そのライブラリを使用する場合は、IO (UArray (Int, Int, Int) Word8)が適しています。

+0

ありがとうございます。私はより詳細な背景で私の質問を更新しました。イメージデータがデータベースから取得された場合、Codec.Image.Devilを使用できますか? –

+0

Codec.Image.DevILはファイルからの読み込みのみをサポートしているようですので、データベースから読み込むために使用することはできません。 – mhwombat

+0

ありがとうございます。 +1は私にそのような良いlibを知らせるために:-D –

関連する問題