Tôi đang cố tải một tệp PNG, nhận các byte RGBA chưa nén, sau đó gửi chúng đến các gói gzip hoặc zlib.Làm thế nào tôi có thể chuyển đổi một (StorableArray (Int, Int) Word8) thành một ByteString lười biếng?
Gói pngload trả về dữ liệu hình ảnh dưới dạng (StorableArray (Int, Int) Word8) và các gói nén mất ByteStrings lười. Vì vậy, tôi đang cố gắng để xây dựng một (StorableArray (Int, Int) Word8 -> ByteString) chức năng.
Cho đến nay, tôi đã thử như sau:
import qualified Codec.Image.PNG as PNG
import Control.Monad (mapM)
import Data.Array.Storable (withStorableArray)
import qualified Data.ByteString.Lazy as LB (ByteString, pack, take)
import Data.Word (Word8)
import Foreign (Ptr, peekByteOff)
main = do
-- Load PNG into "image"...
bytes <- withStorableArray
(PNG.imageData image)
(bytesFromPointer lengthOfImageData)
bytesFromPointer :: Int -> Ptr Word8 -> IO LB.ByteString
bytesFromPointer count pointer = LB.pack $
mapM (peekByteOff pointer) [0..(count-1)]
Điều này làm cho chồng để chạy ra khỏi bộ nhớ, vì vậy rõ ràng tôi đang làm một cái gì đó rất sai. Có nhiều thứ tôi có thể thử với Ptr và ForeignPtr, nhưng có rất nhiều chức năng "không an toàn" trong đó.
Mọi trợ giúp ở đây sẽ được đánh giá cao; Tôi khá bối rối.
Điều này hoạt động rất tốt. Cảm ơn đã giúp đỡ! –