0

我对 Haskell 很陌生,所以如果这太基本或者没有什么意义,我深表歉意。我正在尝试阅读图像;我可以使用以下代码将其添加到像素数据列表中:

data Pixel = Pixel {
    red :: Integer,
    green :: Integer,
    blue :: Integer,
    alpha :: Integer
} deriving (Show)

getImagePixelArray :: FilePath -> IO (Codec.Picture.Repa.Img RGBA)
getImagePixelArray fp = do
    img <- (either error return =<< readImageRGBA fp)
    return img

getImagePixelData :: Codec.Picture.Repa.Img RGBA -> [(Word8,Word8,Word8,Word8)]
getImagePixelData img = R.toList (collapseColorChannel img)

rawPixelToPixel :: (Word8,Word8,Word8,Word8) -> Pixel
rawPixelToPixel (r, g, b, a) = Pixel  {
    red = (toInteger r),
    green = (toInteger g),
    blue = (toInteger b),
    alpha = (toInteger a)
}

main = do
    imageData <- getImagePixelArray "./images/image1.png"
    let imageRawPixels = getImagePixelData imageData
    let asPixels = Prelude.map rawPixelToPixel imageRawPixels 
    mapM print asPixels

我或多或少地关注正在发生的事情,但我对 Haskell 的了解仍然有限,所以在理解 api 文档时,我有点挣扎。

我真的希望能够解析像素的位置;如果我知道图像的宽度和高度,我知道该怎么做,但我不知道如何获取图像的宽度/高度。

我正在学习 Haskell 课程,但我也在尝试将其付诸实践,以帮助深入了解这些概念。

4

1 回答 1

3

从文档开始。您所要求的显然都没有在 上可用Img,那么它还能在哪里呢?有一个相关Image类型,在convertImage的文档中提到 - 我想知道那是什么。事实证明,它有一个 width 和一个 height。那么,我们怎样才能Image从我们的 中得到一个Img呢?imgToImage会给我们一个DynamicImage,它有几个构造函数,每个都包含一个Image. Image弄清楚你的内部有什么样的DynamicImage,然后询问Image它的尺寸。

也许该模块中的其他镜头-y 的东西更容易,但这对我来说并不明显,而且这种方法似乎很简单,如果麻烦的话。

于 2020-05-13T08:49:33.920 回答