我有一個應用程序使用OpenGL和GLUT在屏幕上顯示一些東西。我想訪問「逐個像素」顯示的顏色,但我無法理解所提供的方法。從OpenGL/GLUT讀取像素應用
好像訪問這樣的數據的方式與功能: readPixels :: Position -> Size -> PixelData a -> IO()
是斷然非Haskelly,因爲它使用的拍攝目標指針和寫入該指針模式C。
第三個參數是重要的部分,它的構造像PixelData PixelFormat DataType (Ptr a)
。 PixelFormat
和DataType
都是枚舉,前者取值如RGBAInteger, RGBA, CMYK, etc
,後者取值如UnsignedByte, Short, Float, etc.
這些選項讓我感到困惑,但這不是真正的問題。我在哪裏使用指針真的很困難。我不知道什麼樣的Storable
數據到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
是任意的,它們聽起來足夠無害。我真正想要的是某種格式(如Color 4
或某種性質)的RGBA像素值列表或多維列表。任何幫助將不勝感激,我似乎在我的頭上。
我得到一個'withForeignPtr'之後的某處有段錯誤,有什麼想法? – Scott
Segfault發生在'peekArray'過程中。 – Scott
固定代碼:https://gist.github.com/ssadler/316daa219ff412e1b5c6 – Scott