首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell光泽:将图片渲染到位图

Haskell光泽:将图片渲染到位图
EN

Stack Overflow用户
提问于 2014-03-03 10:59:37
回答 3查看 1.5K关注 0票数 9

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

如果在光泽度方面很难做到这一点,那么是否有一种具有实时高级别位图操作(平移、旋转、透明)的替代方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-04 02:29:02

事实证明,在这种情况下可以使用readPixels。我在浏览#haskell聊天日志时发现了这个片段:

代码语言:javascript
复制
-- 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

票数 1
EN

Stack Overflow用户

发布于 2019-02-26 22:37:51

最近发布了一个新的包光泽-出口,其目的是:

输出光泽图片,如PNG,位图,TGA,TIFF,Gif

票数 1
EN

Stack Overflow用户

发布于 2014-03-03 14:28:36

我曾经遇到过同样的问题,但找不到一个好的解决方案,所以我的答案可能不合适。我的解决办法是使用bmp包,手动处理BMP内容(通过ByteString操作),然后用bitmapOfBMP将其转换为光滑的位图。例如,这是一个将位图与颜色混合的函数:

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22144972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档