所以我有这个疑问。我已经有适用于本地(嵌入式)图像文件的代码,但是现在我需要加载外部图像。用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
| ^^^^^^^^^^^^^
查看loadImageExt和readImage的来源,我看不到它实际上在哪里执行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
答案 0 :(得分:1)
loadImageExt
似乎期望使用FilePath
,而不是URL,但这不是编译器所抱怨的。有人抱怨返回的特定图像DImage Double External
不是Renderable
。这可能是因为使用中的renderer无法理解外部图片;例如,Diagrams.Backend.SVG
似乎支持Embedded
,但不支持External
。相反,Diagrams.Backend.Html5
支持External
,但不支持Embedded
。猜测是,您的图表应该使用本地文件名而不是跨站点URL来引用图像。可能您可以使用uncheckedImageRef
注入URL,但前提是后端必须支持External
。 Diagrams manual section on images声称仅开罗后端可以这样做,但这可能是不准确的。