所以我有这个疑问。我已经有了可以处理本地(嵌入)图像文件的代码,但现在我需要加载一个外部图像。愚蠢的替换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