Haskell 创建要与repa devil一起使用的图像

Haskell 创建要与repa devil一起使用的图像,haskell,repa,Haskell,Repa,我正在使用repa-devil读写图像。现在我需要以编程方式创建图像。但是,Data.Array.Repa.IO.DevIL中的Image构造函数(如RGB)都需要外部内存缓冲区数组。我必须去学习如何使用外国指针吗(听起来很可怕)?或者我可以将未绑定数组转换为我需要的类型吗 emptyImage :: RandomGen r => (Int, Int) -> Rand r Image emptyImage (w,h) = do xs <- getRandomRs (0, 2

我正在使用
repa-devil
读写图像。现在我需要以编程方式创建图像。但是,
Data.Array.Repa.IO.DevIL
中的
Image
构造函数(如
RGB
)都需要外部内存缓冲区数组。我必须去学习如何使用外国指针吗(听起来很可怕)?或者我可以将未绑定数组转换为我需要的类型吗

emptyImage :: RandomGen r => (Int, Int) -> Rand r Image
emptyImage (w,h) = do
  xs <- getRandomRs (0, 255)
  let ps = take (w*h*3) xs :: [Word8]
  let arr = fromListUnboxed (Z :. w :. h :. (3::Int)) ps :: Array U DIM3 Word8
  let arr2 = ???how can I convert arr??? :: Array F DIM3 Word8
  return $ RGB arr2
emptyImage::RandomGen r=>(Int,Int)->兰德r图像
空图像(w,h)=do

xs最简单的方法是使用更通用的
fromList
函数。 那样的话,你就可以

...
let arr = fromList (Z :. w :. h :. (3 :: Int)) ps :: Array F DIM3 Word8
return $ RGB arr
fromList
函数可在
Data.Array.Repa.Eval

fromList :: (Shape sh, Target r e) => sh -> [e] -> Array r sh eSource
通常,您可以确保在显化您的文档时生成所需的表示 使用
computeP
函数的数组。所以,你可以这样做 以下内容(如果您不介意额外复制)

让arr=fromlistunbox(Z:.w:.h:(3::Int))ps::数组U DIM3 Word8

我想你真的需要写一些不同于随机图像的东西。如果您可以构造纯索引函数,那么通过
D
elayed array,将数组加载到内存中的方法将更加有效:

let delayed = fromFunction (Z :. w :. h :. (3::Int))
                           (\(Z :. x :. y :. comp) -> myComp)
foreignArr <- computeP delayed
但是,如果您确实想要随机图像,
yarr
允许相对快速地加载带有状态计算的数组:

import Data.Yarr
import Data.Yarr.Shape as S
import qualified Data.Yarr.Utils.FixedVector as V
import Data.Yarr.IO.Image

emptyImage :: StdGen -> Dim2 -> IO (Image, StdGen)
emptyImage gen sh@(h, w) = do
    arr <- new sh
    let writeRandColor gen i _ = do
            let (rgb, gen') = runRand (V.replicateM random) gen
            linearWrite arr i rgb
            return gen'
    gen' <- S.foldl writeRandColor (return gen) (const ()) 0 (size sh)
    touchArray arr
    return (RGB arr, gen')
导入数据.Yarr
将Data.Yarr.Shape导入为S
将限定数据.Yarr.Utils.FixedVector作为V导入
导入Data.Yarr.IO.Image
emptyImage::StdGen->Dim2->IO(图像,StdGen)
空映像根sh@(h,w)=do
啊
let delayed =
        fromFunction (h, w)
                     (\(y, x) -> return $ VecList [myRed, myGreen, myBlue])
foreignArr <- dComputeP delayed
import Data.Yarr
import Data.Yarr.Shape as S
import qualified Data.Yarr.Utils.FixedVector as V
import Data.Yarr.IO.Image

emptyImage :: StdGen -> Dim2 -> IO (Image, StdGen)
emptyImage gen sh@(h, w) = do
    arr <- new sh
    let writeRandColor gen i _ = do
            let (rgb, gen') = runRand (V.replicateM random) gen
            linearWrite arr i rgb
            return gen'
    gen' <- S.foldl writeRandColor (return gen) (const ()) 0 (size sh)
    touchArray arr
    return (RGB arr, gen')