如上所述:我如何使用SDL-image绑定到Haskell的图像加载工具来加载OpenGL纹理,就像你经常在C中做的那样.SDL-image支持很好各种图像格式,但只提供Surface
数据类型。对于glTexImage2D
,似乎我需要提供一些不同的PixelData
数据类型。
如何在不诉诸C的情况下获取图像数据?我甚至会使用其他一些库,只要它能给我PNG,JPG和TGA支持。
答案 0 :(得分:2)
使用SDL曲面& Haskell绑定使用surfaceGetPixels
它返回Pixels
,Ptr PixelData
是PixelData
的类型别名,Ptr Word32
是空数据声明。之所以这样,是因为SDL表面像素格式&每个像素的位数几乎可以是任何东西。所以基本上如果你有32bpp格式,你可以使用castPtr
将指针指向getPixel32 :: MonadIO m => Surface -> Int -> Int -> m Pixel
getPixel32 s x y = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
Pixel `liftM` peekElemOff (castPtr ps :: Ptr Word32) offset
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
setPixel32 :: MonadIO m => Surface -> Int -> Int -> Pixel -> m ()
setPixel32 s x y (Pixel pixel) = liftIO $ do
ps <- surfaceGetPixels s
assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x
。
以下是获取/放置像素的示例:
{{1}}
所以类似地你可以将指针强制转换为特定的指针类型并将其提供给glTexImage2D来上传纹理。
答案 1 :(得分:1)
也许Codec.Image.DevIL提供了您正在寻找的内容?无论如何,我相信应该。