Haskell gloss:将图片渲染为位图

Haskell gloss:将图片渲染为位图,haskell,gloss,Haskell,Gloss,我想访问显示在窗口中的像素数据,但我没有在gloss中找到这样的函数,也没有尝试在键盘事件回调中调用OpenGL readPixels。它看起来像是gloss在不暴露渲染位图的情况下将图片渲染到窗口 如果在gloss中很难做到这一点,那么有没有其他方法可以进行实时高级位图操作(平移、旋转、透明度)?我曾经遇到过同样的问题,但找不到好的解决方案,因此我的答案可能不合适。我的解决方法是使用bmp包,手动处理bmp内容(通过ByteString操作),然后使用bitmapOfBMP将其转换为光滑位图。

我想访问显示在窗口中的像素数据,但我没有在gloss中找到这样的函数,也没有尝试在键盘事件回调中调用OpenGL readPixels。它看起来像是gloss在不暴露渲染位图的情况下将图片渲染到窗口


如果在gloss中很难做到这一点,那么有没有其他方法可以进行实时高级位图操作(平移、旋转、透明度)?

我曾经遇到过同样的问题,但找不到好的解决方案,因此我的答案可能不合适。我的解决方法是使用
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

这在当时对我来说已经足够了,所以我不再寻找更好的解决方案。如果你发现了什么,请分享。

事实证明,
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)
——将屏幕截图另存为二进制PPM
快照使用::(BS.ByteString->IO b)->位置->大小->IO b
带有f p0 vp@(尺寸vw vh)=do的快照
设fi q=积分q
p6=“p6\n”++显示vw+++++++++显示vh++”255\n
可分配字节(fi(vw*vh*3))$\ptr->do
readPixels p0 vp$PixelData RGB UnsignedByte ptr
px表格[0..vh-1]$\y->
BSI.memcpy
(d`plusPtr`fi(y*vw*3))
(ptr`plusPtr`fi((vh-1-y)*vw*3))
(金融机构(大众*3))
f$BS.pack(map(toEnum.fromnum)p6)`BS.append`px
writeSnapshot::文件路径->位置->大小->IO()
writeSnapshot f=快照(BS.writeFile f)
最近发布了一个新的软件包,其目的如下:

将光泽图片导出为PNG、位图、TGA、TIFF、Gif


我正在寻找相反的转换:图片->BMP