Tôi có một ứng dụng sử dụng OpenGL và GLUT để hiển thị một số nội dung trên màn hình. Tôi muốn truy cập các màu được hiển thị "pixel by pixel" nhưng tôi gặp sự cố khi hiểu các phương thức được cung cấp.Đọc pixel từ Ứng dụng OpenGL/GLUT
Dường như cách truy cập dữ liệu như vậy là có chức năng: readPixels :: Position -> Size -> PixelData a -> IO()
quyết định không Haskelly vì sử dụng mẫu C để lấy con trỏ đích và ghi vào con trỏ đó.
Đối số thứ ba là phần quan trọng và được xây dựng như PixelData PixelFormat DataType (Ptr a)
. PixelFormat
và DataType
là cả hai enums, các giá trị cũ tham gia như RGBAInteger, RGBA, CMYK, etc
và sau này lấy giá trị như UnsignedByte, Short, Float, etc.
Các lựa chọn là khó hiểu với tôi, nhưng đó không phải là vấn đề thực sự. Nơi tôi thực sự đấu tranh với việc sử dụng con trỏ. Tôi không biết loại dữ liệu Storable
nào là malloc
để tạo con trỏ hoặc có bao nhiêu byte để phân bổ nếu tôi chọn sử dụng mallocBytes
.
Tôi có một chức năng tôi đang rối tung xung quanh với hiện trông giống như sau:
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
Nó chạy tốt tôi chỉ không có ý tưởng làm thế nào để sử dụng dữ liệu tôi nhận được từ Ptr
. Có lẽ tôi không hiểu đầy đủ về tài liệu, nhưng làm cách nào tôi có thể xác định loại dữ liệu tại con trỏ và cách tôi có thể sử dụng nó trong chương trình của mình? Lưu ý rằng sự lựa chọn của tôi đối số RGBA
và Int
là tùy ý, chúng chỉ nghe đủ vô hại. Những gì tôi thực sự muốn là một số danh sách hoặc danh sách đa chiều của các giá trị pixel RGBA ở một số định dạng (Color 4
hoặc một cái gì đó có tính chất đó). Bất kỳ sự giúp đỡ nào sẽ được đánh giá rất cao, tôi dường như đang ở trong đầu tôi.
tôi nhận được một segfault một nơi nào đó sau khi 'withForeignPtr', bất kỳ ý tưởng? – Scott
Segfault xảy ra trong 'peekArray'. – Scott
Mã cố định: https://gist.github.com/ssadler/316daa219ff412e1b5c6 – Scott