获取图像的高度和宽度

时间:2020-05-13 08:34:39

标签: haskell repa

我对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课程的学习,但同时我也在尝试将其实际应用,以帮助将概念融入其中。

1 个答案:

答案 0 :(得分:3)

the documentation开始。 Img显然没有您要的内容,那么它还能在哪里呢? Image的文档中提到了一种相关的convertImage类型-我想知道那是什么。事实证明,it has a width and a height。那么,如何从Image中获得ImgimgToImage将给我们一个DynamicImage,其中有几个构造函数,每个构造函数都包含一个Image。找出Image内的DynamicImage类型,然后询问Image的尺寸。

该模块中的其他镜头类东西也许有一些更简单的方法,但对我而言并不明显,而且这种方法似乎很简单,如果有麻烦的话。

相关问题