2014-03-03 80 views
6

我想訪問正在向窗口顯示內容的像素數據,但我沒有任何運氣找到這樣的光澤函數,也沒有嘗試在鍵盤中調用OpenGL readPixels事件回調。它看起來像光澤渲染圖片到窗口而不暴露渲染的位圖。哈斯克爾光澤:渲染圖片到位圖

如果這很難做光澤,是否有替代方案具有實時高級位圖操作(平移,旋轉,透明度)?

回答

1

原來readPixels可以在這種情況下使用。我發現這個片段,同時通過#haskell聊天記錄挖掘:

-- save a screenshot to a handle as binary PPM 
snapshotWith :: (BS.ByteString -> IO b) -> Position -> Size -> IO b 
snapshotWith f p0 [email protected](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

0

我曾經有同樣的問題,找不到一個好的解決方案,所以我的答案可能不合適。我的解決方法是使用bmp包,手動處理BMP內容(通過ByteString操作),然後使用bitmapOfBMP將其轉換爲光滑的位圖。例如,這是一個功能混合的位圖與彩色:

recolor :: (Float, Float, Float) -> BMP -> BMP 
recolor (rc, gc, bc) [email protected] {bmpRawImageData = raw} = 
    bmp {bmpRawImageData = B.pack $ process $ B.unpack raw} where 
    process (b:g:r:a:xs) = (mul b bc):(mul g gc):(mul r rc):a:process xs 
    process xs = xs 
    mul c cc = round $ cc * fromIntegral c 

這是足以讓我在那個時間,所以我停止尋找更好的解決方案。如果你能找到一些東西,請分享。

+2

我在尋找相反的轉換:圖片 - > BMP –