Estoy tratando de cargar un archivo PNG, obtener los bytes RGBA sin comprimir y luego enviarlos a los paquetes gzip o zlib.¿Cómo puedo convertir un (StorableArray (Int, Int) Word8) en un byteString perezoso?
El paquete pngload devuelve datos de imagen como (StorableArray (Int, Int) Word8), y los paquetes de compresión toman ByteStrings perezosos. Por lo tanto, estoy intentando construir una función (StorableArray (Int, Int) Word8 -> ByteString).
Hasta ahora, he intentado el siguiente:
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)]
Esto hace que la pila que se quede sin memoria, tan claramente que estoy haciendo algo muy malo. Hay más cosas que podría probar con Ptr's y ForeignPtr's, pero hay muchas funciones "inseguras" allí.
Cualquier ayuda aquí sería apreciada; Estoy bastante perplejo.
Esto funciona muy bien. ¡Gracias por la ayuda! –