Ich versuche eine PNG-Datei zu laden, die unkomprimierten RGBA-Bytes zu erhalten und sie dann an die gzip- oder zlib-Pakete zu senden.Wie kann ich ein (StorableArray (Int, Int) Word8) in einen faulen ByteString konvertieren?
Das pngload-Paket gibt Bilddaten als (StorableArray (Int, Int) Word8) zurück und die Komprimierungspakete nehmen faule ByteStrings. Daher versuche ich eine Funktion (StorableArray (Int, Int) Word8 -> ByteString) zu erstellen.
Bisher habe ich versucht, die folgenden:
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)]
Dies bewirkt, dass der Stapel aus dem Speicher zu laufen, so klar mache ich etwas sehr falsch. Es gibt mehr Dinge, die ich mit PTRs und ForeignPtrs ausprobieren könnte, aber es gibt viele "unsichere" Funktionen darin.
Jede Hilfe hier würde geschätzt werden; Ich bin ziemlich ratlos.
Das funktioniert sehr gut. Danke für die Hilfe! –