如何将图像加载到列表中?

时间:2014-02-08 22:27:33

标签: haskell image-processing

我正在使用Haskell并尝试编写函数

loadImage :: FilePath -> IO [RGBAPixel]
loadImage = ...
type RBGAPixel = (Double, Double, Double, Double)

我意识到列表并不是最有效的方法 - 但我只是想把目前的东西塞进我现有的结构中。将图像(.jpg,.bmp,.png或.tga)加载到Haskell的列表中最简单的方法是什么?

2 个答案:

答案 0 :(得分:4)

使用JuicyPixels-repa这很简单,不需要任何外部(C)库:

import Codec.Picture.Repa (readImageRGBA, collapseColorChannel)
import Data.Array.Repa as R
import Data.Word

loadImage :: FilePath -> IO [(Word8,Word8,Word8,Word8)]
loadImage fp = do
    img <- either error return =<< readImageRGBA fp
    let arr = collapseColorChannel img
    return $ R.toList arr

或者采用更无瑕疵的风格:

loadImage = fmap (R.toList . collapseColorChannel . either error id) . readImageRGBA

(注意所有这些代码都是键入的,未经过测试。如有任何问题,请随时大喊)

广告中的真相:我维持着JP-repa。

答案 1 :(得分:0)

使用事实上使用JuicyPixels for IO的Haskell Image Processing library,可以让您以一种非常简单的方式读写所有支持的格式:

>>> img <- readImageRGB "image.jpg"
>>> :t (toLists img)
(toLists img) :: [[Pixel RGB Double]]  

当然,最好使用库的界面来操作图像而不是使用列表。