Какая библиотека haskell позволит мне сохранить 2D-массив / вектор в файл png / jpg / gif ...? - PullRequest
15 голосов
/ 04 марта 2011

Я играю с Haskell, начиная с простых программ прорисовки, чтобы намочить ноги.Мне нужна библиотека, которая позволит мне сохранить 2D-массив / вектор в файл изображения.Я не хочу писать список цветов.Я хочу использовать контейнеры, которые предназначены для вычислений типа массива / вектора и могут (ну, почти ) автоматически распараллеливаться.

РЕДАКТИРОВАТЬ Возможность сохранения цветных изображений является обязательным.

Ответы [ 4 ]

8 голосов
/ 04 марта 2011

Я бы начал с библиотеки PGM . Это очень простой несжатый формат Graymap. Практически нет дополнительных зависимостей. Вы можете конвертировать PGM в другие форматы с помощью ImageMagick или других инструментов.

PGM поддерживает общий интерфейс IArray и должен работать с большинством стандартных массивов Haskell. Вы можете легко распараллелить вычисления массива с Control.Parallel.Strategies.

Пример использования PGM:

ghci> :m + Data.Array Graphics.Pgm 
ghci> let a = accumArray (+) 0 ((0::Int,0::Int),(127,127)) [ ((i,i), 1.0::Double) | i <- [0..127] ]
ghci> arrayToFile "t.pgm" (fmap round a)

А это изображение:

t.pgm

В противном случае вы можете использовать Codec-Image-DevIL , который может сохранять распакованные массивы во многие форматы изображений. Вам также понадобится библиотека DevIL . И вам нужно будет преобразовать все массивы в определенный тип (UArray (Int, Int, Int) Word8).

Наконец, если вы хотите иметь передний край, вы можете рассмотреть repa параллельные массивы и соответствующую библиотеку repa-io, которая может записать их в изображения BMP . К сожалению, сегодня repa еще не может быть собран с новым GHC 7.0.2 и не дает преимуществ по производительности на старом GHC 6.12.

6 голосов
/ 21 мая 2011

Новая комбинация:

  • repa ;для n -мерных массивов, плюс
  • repa-devil , для загрузки изображений в десятках форматов.

Repa является единственнымшироко используемая библиотека массивов, которая автоматически распараллеливается.

Пример из руководства по репа , используя readImage и writeImage, чтобы прочитать изображение, повернуть его и записать обратнов любом формате:

import System.Environment
import Data.Word
import Data.Array.Repa hiding ((++))
import Data.Array.Repa.IO.DevIL

main = do
    [f] <- getArgs
    runIL $ do
        v   <- readImage f
        writeImage ("flip-"++f) (rot180 v)

rot180 :: Array DIM3 Word8 -> Array DIM3 Word8
rot180 g = backpermute e flop g
    where
        e@(Z :. x :. y :. _)   = extent g

        flop (Z :. i         :. j         :. k) =
             (Z :. x - i - 1 :. y - j - 1 :. k)
2 голосов
/ 06 января 2014

Более поздняя библиотека JuicyPixels позволяет легко сохранять изображения в Jpg / Png / Tiff, вы можете использовать их в сочетании с Repa с JuicyPixels-repa библиотека.

1 голос
/ 25 апреля 2011

Вы также можете проверить Диаграммы

Пример кода для фрактала с драконом:

{- Heighway dragon.  See http://en.wikipedia.org/wiki/Dragon_curve. -}
module Main where

import Graphics.Rendering.Diagrams
import Control.Monad.State
import Data.Maybe

dragonStr :: Int -> String
dragonStr 0 = "FX"
dragonStr n = concatMap rules $ dragonStr (n-1)
  where rules 'X' = "X+YF+"
        rules 'Y' = "-FX-Y"
        rules c = [c]

strToPath :: String -> Path
strToPath s = pathFromVectors . catMaybes $ evalState c (0,-1)
  where c        = mapM exec s
        exec 'F' = Just `fmap` get
        exec '-' = modify left >> return Nothing
        exec '+' = modify right >> return Nothing
        exec _   = return Nothing
        left (x,y)  = (-y,x)
        right (x,y) = (y,-x)

dragon :: Int -> Diagram
dragon = lc red . curved 0.8 . strToPath . dragonStr

main = renderAs PNG "dragon.png" (Width 300) (dragon 12)
...