所以我对此表示怀疑。我已经有了处理本地(嵌入式)图像文件的代码,但是现在我需要加载一个外部映像。用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-导管,在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
发布于 2018-07-03 13:21:42
loadImageExt似乎期待的是一个FilePath,而不是一个FilePath,但这不是编译器所抱怨的。它抱怨返回的特定图像,即DImage Double External,不是Renderable。这可能是因为使用中的渲染器不理解外部映像;例如,Diagrams.Backend.SVG似乎支持Embedded,但不支持External。相反,Diagrams.Backend.Html5支持External,但不支持Embedded。据猜测,您的图表将使用本地文件名来表示图像,而不是跨站点URL。您可以向URL注入uncheckedImageRef,但前提是后端支持External。关于图像的图表手册部分声称只有Cairo后端才会这么做,但这可能是不准确的。
https://stackoverflow.com/questions/51143927
复制相似问题