Я пытаюсь загрузить файл PNG, получить несжатые байты RGBA, а затем отправить их в пакеты gzip или zlib.
Пакет pngload возвращает данные изображения в виде (StorableArray (Int, Int) Word8), а пакеты сжатия принимают ленивые ByteStrings. Поэтому я пытаюсь создать функцию (StorableArray (Int, Int) Word8 -> ByteString).
До сих пор я пробовал следующее:
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)]
Это приводит к тому, что в стеке заканчивается память, поэтому очевидно, что я делаю что-то очень неправильно. Есть и другие вещи, которые я мог бы попробовать с Ptr и ForeignPtr, но там много "небезопасных" функций.
Любая помощь здесь будет оценена по достоинству; Я довольно озадачен.