如何使用JuicyPixel加载图像?

时间:2015-02-25 04:51:50

标签: haskell

Haskell的JuicyPixel库具有加载png图像readPng的功能。问题是此函数返回Either String DynamicImage类型,其中大多数库函数实际上使用Image类型。图书馆的文档不清楚从Image的结果中获取正确readPng的正确方法是什么。

到目前为止,这就是我所做的:

import Codec.Picture

main = do
    imageLoad <- readPng "myImage.png"
    case imageLoad of
        Left error  -> putStrLn error
        Right image -> do
            putStrLn "success"
            case image of
                ImageY8 img     -> print "TODO: deal with this case."
                ImageY16 img    -> print "TODO: deal with this case."
                ImageYF img     -> print "TODO: deal with this case."
                ImageYA8 img    -> print "TODO: deal with this case."
                ImageYA16 img   -> print "TODO: deal with this case."
                ImageRGB8 img   -> print "TODO: deal with this case."
                ImageRGB16 img  -> print "TODO: deal with this case."
                ImageRGBF img   -> print "TODO: deal with this case."
                ImageRGBA8 img  -> print "TODO: deal with this case."
                ImageRGBA16 img -> print "TODO: deal with this case."
                ImageYCbCr8 img -> print "TODO: deal with this case."
                ImageCMYK8 img  -> print "TODO: deal with this case."
                ImageCMYK16 img -> print "TODO: deal with this case."
    print "Done."

当然,我不打算手动处理所有可能的编码,所以我只是(通过反复试验)找出了我得到的图像类型(它是ImageRGBA8)并且部分匹配它。这听起来像是一个非常糟糕的主意 - 这是真的必须如何完成,还是库提供了一种正确的方式来加载你要求的格式的图像?

1 个答案:

答案 0 :(得分:4)

转换不是免费的,因此您可以选择以您提供的格式或转换方式对图像进行操作。换句话说,你可以:

  • 对动态图像使用多态操作(有一些)
  • 明确销毁DynamicImage并使用已知编码对图像进行操作。
  • 将任何编码转换为单个编码进行操作。

最后一个选项似乎是最直接的选择,并得到JuicyPixels-utils包的支持。具体来说,请参阅fromDynamicImagereadImageRGBA8 functions