8

我正在尝试建模 adata 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,但请记住,像素值将被装箱,这会降低性能。

另一类类似的能力和值得考虑的是向量

另一方面,如果您打算操作像素并且将图像视为一团,ByteString这是一个不错的选择。这就是它的设计目的:二进制数据块。

总而言之:使用Arrayor进行操作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 数组。索引是(行、列、颜色通道)。IO (UArray (Int, Int, Int) Word8)如果您要使用该库,那将是一个不错的选择。

于 2013-01-07T08:33:50.530 回答