Я бы начал с библиотеки 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](https://i.stack.imgur.com/kLjsP.png)
В противном случае вы можете использовать Codec-Image-DevIL , который может сохранять распакованные массивы во многие форматы изображений. Вам также понадобится библиотека DevIL . И вам нужно будет преобразовать все массивы в определенный тип (UArray (Int, Int, Int) Word8
).
Наконец, если вы хотите иметь передний край, вы можете рассмотреть repa
параллельные массивы и соответствующую библиотеку repa-io
, которая может записать их в изображения BMP . К сожалению, сегодня repa
еще не может быть собран с новым GHC 7.0.2 и не дает преимуществ по производительности на старом GHC 6.12.