我有一个应用程序,使用OpenGL和GLUT在屏幕上显示一些东西。 我想以“逐像素”的方式访问显示的颜色,但我不理解提供的方法。
似乎访问此类数据的方法是使用函数: “readPixels :: Position -> Size -> PixelData a -> IO()” 这显然不是Haskelly,因为它使用C模式接收目标指针并将其写入该指针。
第三个参数是重要部分,它构造如“PixelData PixelFormat DataType(Ptr a)”。 "PixelFormat" 和 "DataType" 都是枚举,前者取值如“RGBAInteger,RGBA,CMYK等”,后者取值如“UnsignedByte,Short,Float等”。 选择对我来说很困惑,但那不是真正的问题。 我真正遇到麻烦的地方在于使用指针。我不知道要使用哪种“可存储”数据来“malloc”创建指针,如果我选择使用“mallocBytes”,要分配多少字节。
我正在尝试玩弄的一个函数当前看起来像这样:
它可以正常运行,但我不知道如何使用从
似乎访问此类数据的方法是使用函数: “readPixels :: Position -> Size -> PixelData a -> IO()” 这显然不是Haskelly,因为它使用C模式接收目标指针并将其写入该指针。
第三个参数是重要部分,它构造如“PixelData PixelFormat DataType(Ptr a)”。 "PixelFormat" 和 "DataType" 都是枚举,前者取值如“RGBAInteger,RGBA,CMYK等”,后者取值如“UnsignedByte,Short,Float等”。 选择对我来说很困惑,但那不是真正的问题。 我真正遇到麻烦的地方在于使用指针。我不知道要使用哪种“可存储”数据来“malloc”创建指针,如果我选择使用“mallocBytes”,要分配多少字节。
我正在尝试玩弄的一个函数当前看起来像这样:
pixels :: IO ()
pixels = do
pointer <- mallocBytes 50000
let pdata = PixelData RGBA Int pointer
let pos = Position 0 0
let siz = Size 10 10
readPixels pos siz pdata
print pdata
mypixels <- peek pointer
-- TODO, what kind of data is mypixels?
free pointer
它可以正常运行,但我不知道如何使用从
Ptr
获取的数据。也许我没有完全理解文档,但我该如何确定指针处的数据类型以及如何在程序中使用它?请注意,我选择RGBA
和Int
参数是任意的,它们听起来无害。我真正想要的是一些格式的RGBA像素值的列表或多维列表(例如Color 4
)。任何帮助都将不胜感激,我似乎陷入了困境。
withForeignPtr
之后我得到了一个段错误,有什么想法吗? - ScottpeekArray
期间发生了“段错误”。 - Scott