1

私はrepa-devil画像の読み取りと書き込みに使用しています。次に、プログラムで画像を作成する必要があります。ただし、すべてのImageコンストラクター(などRGB)にはData.Array.Repa.IO.DevIL、外部メモリバッファー配列が必要です。私は立ち去って、その外国のポインターのもの(怖いように聞こえます)を扱う方法を学ぶ必要がありますか?または、ボックス化されていない配列を必要なタイプに変換できますか?

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
4

2 に答える 2

1

最も簡単な方法は、より一般的な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。したがって、次のようなことを行うことができます(余分なコピーを気にしない場合)

let arr = fromListUnboxed (Z :. w :. h :. (3::Int)) ps :: Array U DIM3 Word8
arr2 <- computeP arr
return $ RGB arr2

RGBコンパイラーはコンストラクターを使用できるようにするために必要な型を知っているため、型の注釈は不要です。

于 2013-02-26T18:37:10.463 に答える
1

ランダムな画像とは違うものを書く必要があると思います。純粋なインデックス関数を作成できる場合は、Delayed配列を使用して、配列をメモリにロードするためのはるかに効率的な方法があります。

let delayed = fromFunction (Z :. w :. h :. (3::Int))
                           (\(Z :. x :. y :. comp) -> myComp)
foreignArr <- computeP delayed

yarrライブラリとyarr-image-ioパッケージを使用すると、そのポートは次repa-devilのようになります。

let delayed =
        fromFunction (h, w)
                     (\(y, x) -> return $ VecList [myRed, myGreen, myBlue])
foreignArr <- dComputeP 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')
于 2013-02-27T20:15:46.687 に答える