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

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


我意识到列表并不是执行此操作的最有效方法-但我现在只是想在现有结构中添加一些内容。将图片(.jpg,.bmp,.png或.tga)加载到Haskell列表中的最简单方法是什么?

最佳答案

使用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。

10-08 12:37