9

ウィンドウに表示されているもののピクセルデータにアクセスしたいのですが、そのような関数をグロスで見つけることも、キーボードイベントコールバックで OpenGL readPixels を呼び出そうとすることもできませんでした。グロスは、レンダリングされたビットマップを公開せずに、ピクチャをウィンドウにレンダリングするように見えます。

これがグロスで行うのが難しい場合、リアルタイムの高レベルのビットマップ操作 (移動、回転、透明度) を備えた代替手段はありますか?

4

3 に答える 3

1

readPixelsこの場合に使用できることがわかりました。#haskell チャットログを掘り下げているときに、このスニペットを見つけました。

-- save a screenshot to a handle as binary PPM
snapshotWith :: (BS.ByteString -> IO b) -> Position -> Size -> IO b
snapshotWith f p0 vp@(Size vw vh) = do
  let fi q = fromIntegral q
      p6 = "P6\n" ++ show vw ++ " " ++ show vh ++ " 255\n"
  allocaBytes (fi (vw*vh*3)) $ \ptr -> do
    readPixels p0 vp $ PixelData RGB UnsignedByte ptr
    px <- BSI.create (fi $ vw * vh * 3) $ \d -> forM_ [0..vh-1] $ \y ->
      BSI.memcpy
        (d`plusPtr`fi(y*vw*3))
        (ptr`plusPtr`fi ((vh-1-y)*vw*3))
        (fi(vw*3))
    f $ BS.pack (map (toEnum . fromEnum) p6) `BS.append` px

writeSnapshot :: FilePath -> Position -> Size -> IO ()
writeSnapshot f = snapshotWith (BS.writeFile f)

https://gitorious.org/maximus/mandulia/source/58695617c322b0b37ec72f9a0bd3eed8308bf700:src/Snapshot.hsから

于 2014-03-04T02:29:02.370 に答える