2015-02-25 3 views
4

В библиотеке JuicyPixel от Haskell есть функция для загрузки png изображений, readPng. Проблема в том, что эта функция возвращает тип Either String DynamicImage, где большинство функций библиотеки фактически используют тип изображения. Документация библиотеки неясно, каков правильный метод получения правильного Image из результата readPng.Как загрузить изображение с помощью JuicyPixel?

До сих пор, это то, что я сделал:

import Codec.Picture 

main = do 
    imageLoad <- readPng "myImage.png" 
    case imageLoad of 
     Left error -> putStrLn error 
     Right image -> do 
      putStrLn "success" 
      case image of 
       ImageY8 img  -> print "TODO: deal with this case." 
       ImageY16 img -> print "TODO: deal with this case." 
       ImageYF img  -> print "TODO: deal with this case." 
       ImageYA8 img -> print "TODO: deal with this case." 
       ImageYA16 img -> print "TODO: deal with this case." 
       ImageRGB8 img -> print "TODO: deal with this case." 
       ImageRGB16 img -> print "TODO: deal with this case." 
       ImageRGBF img -> print "TODO: deal with this case." 
       ImageRGBA8 img -> print "TODO: deal with this case." 
       ImageRGBA16 img -> print "TODO: deal with this case." 
       ImageYCbCr8 img -> print "TODO: deal with this case." 
       ImageCMYK8 img -> print "TODO: deal with this case." 
       ImageCMYK16 img -> print "TODO: deal with this case." 
    print "Done." 

Конечно, я не собираюсь вручную иметь дело с каждым возможным кодирования, так что я просто (методом проб и ошибок) выяснили, тип изображение, которое я получал (это был ImageRGBA8) и частично соответствовал ему. Это звучит как очень плохая идея, однако - действительно ли это нужно сделать, или библиотека предоставляет правильный способ просто загрузить изображение в формате, который вы просите?

ответ

4

Конверсии нуль не являются бесплатными, поэтому ваш выбор заключается в том, чтобы работать с изображением в любом формате, который вы даете или конвертируете. Другими словами, вы можете:

  • использования полиморфных операций на динамических изображений (есть несколько)
  • Явное уничтожение DynamicImage и работать над изображением с известным кодированием.
  • Преобразование любой кодировки в единую кодировку для операций.

Этот последний вариант представляется наиболее прямым и поддерживается пакетом JuicyPixels-utils. В частности, см. fromDynamicImage и readImageRGBA8functions.

+0

Обратите внимание, что для использования полиморфных операций с динамическими изображениями вам придется использовать 'dynamicMap' или' dynamicPixelMap', которые выполняют операции полиморфными по типу 'Pixel' и применяют их к' DynamicImage'. Также обратите внимание, что преобразование не стоит ничего, если ваш 'DynamicImage' имеет нужный тип в первую очередь (так что вы должны выбрать стандартизацию для наиболее распространенного типа изображения, которое вы должны обрабатывать). – Jedai

Смежные вопросы