module File.Binary.PNG (
getChunks,
putChunks,
mkChunks,
ihdr, IHDR(..),
plte,
body,
others,
ICCP(..),
TypeChunk(..),
typeChunk,
Chunk(..),
makePNGHeader,
bsToPNGImage,
pngImageToBS,
PNGImageL(..),
PNGImageLColor(..),
readIccp
) where
import Prelude hiding (concat)
import Data.List (find)
import Data.Maybe (fromJust)
import Data.ByteString.Lazy (ByteString, toChunks, fromChunks, concat)
import Codec.Compression.Zlib (
decompress, compressWith, defaultCompressParams, CompressParams(..),
bestCompression, WindowBits(..))
import File.Binary.PNG.DataChunks (
Chunk(..), TypeChunk(..), typeChunk, IHDR(..), PLTE, IDAT(..),
ICCP(..),
getChunks, putChunks, makePNGHeader, bsToPNGImage, PNGImageL(..),
PNGImageLColor(..), pngImageToBS, readIccp)
body :: [Chunk] -> ByteString
body = decompress . concat . map (idat_body . (\(ChunkIDAT i) -> i)) .
filter ((== T_IDAT) . typeChunk)
mkBody :: ByteString -> [Chunk]
mkBody = map (ChunkIDAT . IDAT . fromChunks . (: [])) . toChunks .
compressWith defaultCompressParams {
compressLevel = bestCompression,
compressWindowBits = WindowBits 10
}
ihdr :: [Chunk] -> IHDR
ihdr = (\(ChunkIHDR i) -> i) . fromJust . find ((== T_IHDR) . typeChunk)
plte :: [Chunk] -> Maybe PLTE
plte c = do
ChunkPLTE pl <- find ((== T_PLTE) . typeChunk) c
return pl
others :: [Chunk] -> [Chunk]
others = filter $ (`notElem` [T_IHDR, T_PLTE, T_IDAT, T_IEND]) . typeChunk
mkChunks :: IHDR -> Maybe PLTE -> [Chunk] -> ByteString -> [Chunk]
mkChunks i (Just p) cs b = ChunkIHDR i : ChunkPLTE p : mkBody b ++ cs
mkChunks i Nothing cs b = ChunkIHDR i : mkBody b ++ cs