哪个haskell库会让我将2D数组/矢量保存到png/jpg/gif ...文件?

rpg*_*rpg 15 arrays haskell multicore image-processing

我正在玩haskell,从简单的绘图程序开始弄湿我的脚.我需要一个库,让我将2D数组/矢量保存到图像文件中.我不想写一份颜色列表.我想使用用于数组/矢量计算的容器,并且可以(好吧,几乎)自动并行化.

编辑存储彩色图像的能力是必须的.

sas*_*nin 8

我从PGM库开始.这是一种非常简单的无压缩灰度图格式.几乎没有附加依赖.您可以使用ImageMagick或其他工具将PGM转换为其他格式.

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)
Run Code Online (Sandbox Code Playgroud)

这是图像:

t.pgm

否则,您可以使用Codec-Image-DevIL,它可以将未装箱的阵列保存为许多图像格式.你也需要DevIL库.并且您需要将所有数组转换为它们的特定类型(UArray (Int, Int, Int) Word8).

最后,如果你想要前沿,你可以考虑repa并行数组和相应的repa-io库,它们可以将它们写入BMP图像.不幸的是,今天repa还没有新的GHC 7.0.2可以构建,并且在旧的GHC 6.12上没有性能优势.


Don*_*art 6

一个新的组合是:

  • 修理 ; 对于n维数组,加上
  • repa-devil,用于数十种格式的图像加载.

Repa是唯一广泛使用的自动并行化的数组库.

一个例子,来自修复教程,使用readImagewriteImage读取图像,旋转它,并以任何格式将其写回:

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)
Run Code Online (Sandbox Code Playgroud)