1

我正在尝试学习如何使用 JuicyPixels 版本 3.2.5.1 加载、修改和保存图像。我有以下代码:

{-# LANGUAGE OverloadedStrings #-}

import Codec.Picture

imageCreator :: String -> IO ()
imageCreator path = writePng path $ generateImage pixelRenderer 250 300
   where pixelRenderer x y = PixelRGB8 (fromIntegral x) (fromIntegral y) 128

loadSampleImage path = case decodePng path of
  Left errorMsg -> putStrLn errorMsg
  Right sampleImage -> putStrLn "Loaded Successfully"

main = do 
  imageCreator "test.png"
  loadSampleImage "test.png"

imageCreator函数是从 JuicyPixels 文档中稍作修改的:https ://hackage.haskell.org/package/JuicyPixels-3.2.5.1/docs/Codec-Picture.html修改是添加了两个调用fromIntegral,如没有它们,这个例子就无法编译。(对我来说,文档中的示例无法编译似乎很奇怪,所以如果我在做一些愚蠢的事情,请告诉我)

运行此程序将创建一个名为“test.png”的图像并打印:

无效的PNG文件,签名损坏

这可能是来自调用的错误消息decodePng。我已经尝试过使用其他一些 PNG,一个是我在 Gimp 中创建的,另一个是我在 MS paint 中创建的。我通过imageCreator "test.png"从我的主要功能中删除该行来做到这一点,以避免覆盖我想要测试的图像。

为了加载 PNG 图像,我应该改变什么?

4

1 回答 1

4
loadSampleImage path = case decodePng path of

您正在尝试将字符串“test.png”解码为PNG。你想要readPng,没有decodePng。(或者您可以只使用readImage而不关心文件的格式。)

于 2015-05-28T16:59:27.547 回答