我正在尝试加载 PNG 文件,获取未压缩的 RGBA 字节,然后将它们发送到 gzip 或 zlib 包。
pngload 包以 (StorableArray (Int, Int) Word8) 形式返回图像数据,压缩包采用惰性字节字符串。因此,我正在尝试构建一个 (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 尝试更多的东西,但是那里有很多“不安全”的功能。
任何帮助将不胜感激;我很困惑。