在Haskell图中加载外部图像

时间:2018-07-02 21:26:07

标签: haskell external haskell-diagrams

所以我有这个疑问。我已经有适用于本地(嵌入式)图像文件的代码,但是现在我需要加载外部图像。用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

1 个答案:

答案 0 :(得分:1)

loadImageExt似乎期望使用FilePath,而不是URL,但这不是编译器所抱怨的。有人抱怨返回的特定图像DImage Double External不是Renderable。这可能是因为使用中的renderer无法理解外部图片;例如,Diagrams.Backend.SVG似乎支持Embedded,但不支持External。相反,Diagrams.Backend.Html5支持External,但不支持Embedded。猜测是,您的图表应该使用本地文件名而不是跨站点URL来引用图像。可能您可以使用uncheckedImageRef注入URL,但前提是后端必须支持ExternalDiagrams manual section on images声称仅开罗后端可以这样做,但这可能是不准确的。