2

所以我有这个疑问。我已经有了可以处理本地(嵌入)图像文件的代码,但现在我需要加载一个外部图像。愚蠢的替换loadImageExt没有帮助:

productImageIO :: IO (Diagram B)
productImageIO = do
  res <- loadImageExt "https://s7d2.scene7.com/is/image/dkscdn/16JDNMJRDNCLPSBLKJRD_Black_Black_White_is/"
  return $
    case res of
      Left err -> mempty
      Right product -> image product



• No instance for (Renderable (DImage Double External) B)
        arising from a use of ‘image’
    • In the expression: image product
      In a case alternative: Right product -> image product
      In the second argument of ‘($)’, namely
        ‘case res of
           Left err -> mempty
           Right product -> image product’
   |
26 |       Right product -> image product
   |                        ^^^^^^^^^^^^^

查看loadImageExtreadImage的来源,我看不到它实际执行 http 内容以获取图像的位置。

文档说,loadImageExt,检查文件是否存在,并使用 JuicyPixels 确定正确的大小,但保存对图像的引用而不是光栅数据

所以请原谅我的无知,但这是否意味着我需要在这种情况下添加http加载逻辑?还是我只是错过了使这项工作发挥作用的一些要点?

UPD:我可能错了,有一些快速简便的方法可以通过放置链接来加载外部图像,但对我有用的是使用http-conduit,在 ByteString 中获取响应并解析它:

productImageIO :: String -> IO (Diagram B)
productImageIO path = do
   response <- fmap getResponseBody $ parseRequest path >>= httpBS
   return $
     case loadImageEmbBS response of
        Left error -> mempty
        Right decodedImage -> image decodedImage

它甚至可以加载 https 图像,例如https://sneakernews.com/wp-content/uploads/2018/01/jordan-russell-westbrook-signature-shoe-creamsicle-3.jpg?w=1140

4

1 回答 1

1

loadImageExt似乎期望一个FilePath,而不是一个 URL,但这不是编译器所抱怨的。它抱怨返回的特定图像 aDImage Double External不是Renderable。这可能是因为使用的渲染器不理解外部图像;例如,Diagrams.Backend.SVG似乎支持Embedded但不支持External。相反,Diagrams.Backend.Html5支持External但不支持Embedded。猜测一下,您的图表应该使用本地文件名来引用图像,而不是跨站点 URL。可能是您可以使用 注入 URL uncheckedImageRef,但前提是后端支持External. 图像上的图表手册部分声称只有 Cairo 后端可以,但这可能是不准确的。

于 2018-07-03T13:21:42.737 回答