Загрузить внешнее изображение в Haskell Diagrams - PullRequest
0 голосов
/ 03 июля 2018

Так что у меня есть это сомнение. У меня уже есть код, который работает с локальными (встроенными) файлами изображений, но теперь мне нужно вместо этого загрузить внешнее изображение. Тупая замена на 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

1 Ответ

0 голосов
/ 03 июля 2018

loadImageExt, кажется, ожидает FilePath, а не URL, но это не то, на что жалуется компилятор. Он жалуется, что конкретное возвращенное изображение, а DImage Double External, не Renderable. Это может быть связано с тем, что используемый рендерер не понимает внешние изображения; например, Diagrams.Backend.SVG поддерживает Embedded, но не External. Напротив, Diagrams.Backend.Html5 поддерживает External, но не Embedded. Предполагается, что ваша диаграмма ссылается на изображения, используя локальные имена файлов, а не межсайтовые URL. Возможно, вы можете ввести URL-адреса с uncheckedImageRef, но все же только в том случае, если бэкэнд поддерживает External. В разделе руководства Diagrams на изображениях утверждается, что это делает только бэкэнд Cairo, но это может быть неточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...