PNG ファイルをロードし、圧縮されていない RGBA バイトを取得してから、それらを gzip または zlib パッケージに送信しようとしています。
pngload パッケージは画像データを (StorableArray (Int, Int) Word8) として返し、圧縮パッケージは遅延 ByteString を取ります。したがって、(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 で試すことができることは他にもありますが、そこには多くの「安全でない」機能があります。
ここで何か助けていただければ幸いです。私はかなり困惑しています。