我想访问窗口显示内容的像素数据,但我没有幸运地找到这样的光泽函数,也没有尝试在键盘事件回调中调用OpenGL readPixels。看起来光泽会将图片渲染到窗口而不会暴露渲染的位图。
如果在光泽度上很难做到这一点,是否有另一种具有实时高级位图操作(平移,旋转,透明度)的方法?
答案 0 :(得分: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)
答案 1 :(得分:0)
我曾经遇到过同样的问题而无法找到一个好的解决方案,所以我的回答可能不合适。我的解决方法是使用bmp
包,手动处理BMP
内容(通过ByteString
操作),然后将其转换为带bitmapOfBMP
的光泽位图。例如,这是一个用于将位图与颜色混合的函数:
recolor :: (Float, Float, Float) -> BMP -> BMP
recolor (rc, gc, bc) bmp@BMP {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 :(得分:0)
最近发布了具有适当用途的新软件包gloss-export:
将光泽图片导出为PNG,位图,TGA,TIFF,Gif