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)并且部分匹配它。这听起来像是一个非常糟糕的主意 - 这是真的必须如何完成,还是库提供了一种正确的方式来加载你要求的格式的图像?
答案 0 :(得分:4)
转换不是免费的,因此您可以选择以您提供的格式或转换方式对图像进行操作。换句话说,你可以:
DynamicImage
并使用已知编码对图像进行操作。最后一个选项似乎是最直接的选择,并得到JuicyPixels-utils
包的支持。具体来说,请参阅fromDynamicImage
和readImageRGBA8
functions。