我正在使用Haskell并尝试编写函数
loadImage :: FilePath -> IO [RGBAPixel]
loadImage = ...
type RBGAPixel = (Double, Double, Double, Double)
我意识到列表并不是最有效的方法 - 但我只是想把目前的东西塞进我现有的结构中。将图像(.jpg,.bmp,.png或.tga)加载到Haskell的列表中最简单的方法是什么?
答案 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]]
当然,最好使用库的界面来操作图像而不是使用列表。