在Haskell中用于内存中图像数据的类型是什么?

Xia*_*Jia 7 haskell types

我正在尝试建模data Photo并想知道用于图像数据的类型:

> data Photo =
>   Photo
>   { photoUploaderId :: AccountId
>   , photoWidth :: Int
>   , photoHeight :: Int
>   , photoData :: ByteString
>   }
Run Code Online (Sandbox Code Playgroud)

我在Data.ByteString这里用.还有更好的选择吗?

背景:我将把图像数据存储在数据库中,并通过网络连接检索和发送它.在第一次将照片插入数据库时​​,我可能需要对其进行一些操作,例如缩放等.

Jan*_*Jan 10

如果您要访问照片的任意像素,请使用未装箱的阵列.它将为您提供O(1)索引和最小的空间开销.UArray (Int, Int) Word32应该是你想要的.记住,未装箱的阵列是严格的.如果您正在寻找非严格性,请使用a Array,但请记住,像素值将被加框,这会降低性能.

另外类似的能力和值得考虑的是矢量.

另一方面,如果你打算操纵像素,你会把图像视为一个blob,这ByteString是一个不错的选择.这就是它的设计目标:二进制数据blob.

总结:使用Array或操作Vector,存储和传输为ByteString.


mhw*_*bat 6

一般来说,UArray是一个不错的选择.这取决于照片格式,你将如何阅读图像,以及你用它做什么样的处理.我发现Codec.Image.DevIL库对于照片处理很方便.这是将JPEG图像转换为PNG的示例.

import Codec.Image.DevIL

main = do
  ilInit
  img <- readImage "test.jpeg"
  writeImage "test.png" img 
Run Code Online (Sandbox Code Playgroud)

readImage函数具有此签名.

readImage :: FilePath -> IO (UArray (Int, Int, Int) Word8)
Run Code Online (Sandbox Code Playgroud)

它返回一个RGBA数组.指数是(行,列,颜色通道).IO (UArray (Int, Int, Int) Word8)如果您打算使用该库,那将是一个不错的选择.

  • 你应该查看JuicyPixels:http://hackage.haskell.org/packages/archive/JuicyPixels/2.0.2/doc/html/Codec-Picture.html,特别是你可以看到像'decodeImage'这样的函数raw ByteString.(你甚至有decodeGif,decodePng,decodeJpeg,decodeBitmap - 所有工作在内存中的ByteString) (2认同)