OpenGL と GLUT を使用して画面に表示するアプリケーションがあります。「ピクセルごと」に表示された色にアクセスしたいのですが、提供されている方法を理解するのに苦労しています。
そのようなデータにアクセスする方法は、 function:
を使用しているようです。readPixels :: Position -> Size -> PixelData a -> IO ()
これは、宛先ポインターを取得してそのポインターに書き込む C パターンを使用するため、明らかに非 Haskelly です。
3 番目の引数は重要な部分であり、 のように構成されてい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 ピクセル値のリストまたは多次元リストです。どんな助けでも大歓迎です、私は頭を抱えているようです。