我想訪問正在向窗口顯示內容的像素數據,但我沒有任何運氣找到這樣的光澤函數,也沒有嘗試在鍵盤中調用OpenGL readPixels事件回調。它看起來像光澤渲染圖片到窗口而不暴露渲染的位圖。哈斯克爾光澤:渲染圖片到位圖
如果這很難做光澤,是否有替代方案具有實時高級位圖操作(平移,旋轉,透明度)?
我想訪問正在向窗口顯示內容的像素數據,但我沒有任何運氣找到這樣的光澤函數,也沒有嘗試在鍵盤中調用OpenGL readPixels事件回調。它看起來像光澤渲染圖片到窗口而不暴露渲染的位圖。哈斯克爾光澤:渲染圖片到位圖
如果這很難做光澤,是否有替代方案具有實時高級位圖操作(平移,旋轉,透明度)?
原來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)
我曾經有同樣的問題,找不到一個好的解決方案,所以我的答案可能不合適。我的解決方法是使用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
這是足以讓我在那個時間,所以我停止尋找更好的解決方案。如果你能找到一些東西,請分享。
我在尋找相反的轉換:圖片 - > BMP –