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

4
我正在使用Haskell并尝试编写一个函数。
loadImage :: FilePath -> IO [RGBAPixel]
loadImage = ...
type RBGAPixel = (Double, Double, Double, Double)

我意识到使用列表并不是最有效的方法,但我只是想将某些东西硬塞到我现有的结构中。在Haskell中,将图像(.jpg、.bmp、.png或.tga)加载到列表中的最简单方法是什么?


3
使用一个库,例如http://hackage.haskell.org/package/Codec-Image-DevIL(这是我的,当然还有其他的)。 - luqui
2个回答

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

或者更加 point-free 风格的写法:

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

请注意,以下所有代码都是打字而非测试。如有问题,请随时提出。

真诚地告知:我维护JP-repa。


我认为这就是我想要的 - 我一直在使用JuicyPixels库,但我无法弄清如何从DynamicImage中获取列表。这段代码给我报错:No instance for (Collapsible RGBA e0) arising from a use of 'collapseColorChannel' - sdasdadas
只是提醒一下:我不知道这对你有什么用处。你没有获得任何坐标信息-所有的像素行都在一个无法区分的列表中! - Thomas M. DuBuisson
@ThomasM.DuBuisson 我认为现在将纹理加载到OpenGL的缓冲系统中应该没问题。它们只是颜色信息的C数组。 - sdasdadas

0
使用Haskell图像处理库,实际上使用JuicyPixels进行IO,可以让您以非常简单的方式读取和写入所有支持的格式:
>>> img <- readImageRGB "image.jpg"
>>> :t (toLists img)
(toLists img) :: [[Pixel RGB Double]]  

当然,使用库的接口来操作图像比使用列表更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接