8

モデル化しようとしてdata Photoいて、画像データにどのタイプを使用するか疑問に思っています:

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

ここを使ってData.ByteStringいます。より良い選択はありますか?

背景: 画像データをデータベースに保存し、それを取得してネットワーク接続経由​​で送信します。写真をデータベースに初めて挿入するときは、拡大縮小などの操作が必要になる場合があります。

4

2 に答える 2

11

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

同様の機能で考慮に値する別のタイプはvectorです。

一方、ピクセルを操作せず、画像をブロブとして扱う場合ByteStringは、良い選択です。バイナリ データのブロブです。

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

于 2013-01-07T08:26:43.913 に答える
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 配列を返します。インデックスは (row,column,color-channel) です。そのライブラリIO (UArray (Int, Int, Int) Word8)を使用する場合は、良い選択です。

于 2013-01-07T08:33:50.530 に答える