From 7e2fff9e0e78dafab1753e882664cf48092c1ae9 Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Mon, 7 Dec 2015 22:19:49 +0100 Subject: [PATCH 01/15] Adding convertRGB8 & convertRGBA8 helper functions. Handle #114 --- JuicyPixels.cabal | 5 +-- changelog | 4 ++ src/Codec/Picture.hs | 89 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/JuicyPixels.cabal b/JuicyPixels.cabal index 12ebc5f..8a6299a 100644 --- a/JuicyPixels.cabal +++ b/JuicyPixels.cabal @@ -1,5 +1,5 @@ Name: JuicyPixels -Version: 3.2.6.5 +Version: 3.2.7 Synopsis: Picture loading/serialization (in png, jpeg, bitmap, gif, tga, tiff and radiance) Description: <> @@ -28,7 +28,7 @@ Source-Repository head Source-Repository this Type: git Location: git://github.com/Twinside/Juicy.Pixels.git - Tag: v3.2.6.5 + Tag: v3.2.7 Flag Mmap Description: Enable the file loading via mmap (memory map) @@ -115,7 +115,6 @@ Library Codec.Picture.ColorQuant Ghc-options: -O3 -Wall - Ghc-prof-options: -rtsopts -Wall -prof -auto-all Build-depends: base >= 4.5 && < 5, bytestring >= 0.9 && < 0.11, mtl >= 1.1 && < 2.3, diff --git a/changelog b/changelog index d2dbe91..dbc641d 100644 --- a/changelog +++ b/changelog @@ -1,6 +1,10 @@ Change log ========== +v3.2.7 2015? +------------ + * adding convertRGB8 and convertRGBA8 helper functions + v3.2.6.5 December 2015 ---------------------- * Fix: Compilation on GHC 7.6/7.8 diff --git a/src/Codec/Picture.hs b/src/Codec/Picture.hs index 4d51856..e48e7db 100644 --- a/src/Codec/Picture.hs +++ b/src/Codec/Picture.hs @@ -1,7 +1,10 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TupleSections #-} +{-# LANGUAGE FlexibleInstances #-} -- | Main module for image import/export into various image formats. -- -- To use the library without thinking about it, look after 'decodeImage' and @@ -23,6 +26,10 @@ module Codec.Picture ( , generateFoldImage , withImage + -- * RGB helper functions + , convertRGB8 + , convertRGBA8 + -- * Lens compatibility , Traversal , imagePixels @@ -138,6 +145,7 @@ module Codec.Picture ( import Control.Applicative( (<$>) ) #endif +import Data.Bits( unsafeShiftR ) import Control.DeepSeq( NFData, deepseq ) import qualified Control.Exception as Exc ( catch, IOException ) import Codec.Picture.Metadata( Metadatas ) @@ -200,6 +208,7 @@ import System.IO.MMap ( mmapFileByteString ) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L +import qualified Data.Vector.Storable as VS -- | Return the first Right thing, accumulating error eitherLoad :: c -> [(String, c -> Either String b)] -> Either String b @@ -263,6 +272,7 @@ readImage = withImageDecoder decodeImage readImageWithMetadata :: FilePath -> IO (Either String (DynamicImage, Metadatas)) readImageWithMetadata = withImageDecoder decodeImageWithMetadata + -- | If you want to decode an image in a bytestring without even thinking -- in term of format or whatever, this is the function to use. It will try -- to decode in each known format and if one decoding succeeds, it will return @@ -270,6 +280,85 @@ readImageWithMetadata = withImageDecoder decodeImageWithMetadata decodeImage :: B.ByteString -> Either String DynamicImage decodeImage = fmap fst . decodeImageWithMetadata +class Decimable px1 px2 where + decimateBitDepth :: Image px1 -> Image px2 + +decimateWord16 :: ( Pixel px1, Pixel px2 + , PixelBaseComponent px1 ~ Pixel16 + , PixelBaseComponent px2 ~ Pixel8 + ) => Image px1 -> Image px2 +decimateWord16 (Image w h da) = + Image w h $ VS.map (\v -> fromIntegral $ v `unsafeShiftR` 8) da + +decimateFloat :: ( Pixel px1, Pixel px2 + , PixelBaseComponent px1 ~ PixelF + , PixelBaseComponent px2 ~ Pixel8 + ) => Image px1 -> Image px2 +decimateFloat (Image w h da) = + Image w h $ VS.map (floor . (255*) . max 0 . min 1) da + +instance Decimable Pixel16 Pixel8 where + decimateBitDepth = decimateWord16 + +instance Decimable PixelYA16 PixelYA8 where + decimateBitDepth = decimateWord16 + +instance Decimable PixelRGB16 PixelRGB8 where + decimateBitDepth = decimateWord16 + +instance Decimable PixelRGBA16 PixelRGBA8 where + decimateBitDepth = decimateWord16 + +instance Decimable PixelCMYK16 PixelCMYK8 where + decimateBitDepth = decimateWord16 + +instance Decimable PixelF Pixel8 where + decimateBitDepth = decimateFloat + +instance Decimable PixelRGBF PixelRGB8 where + decimateBitDepth = decimateFloat + +-- | Convert by any mean possible a dynamic image to an image +-- in RGBA. The process can lose precision while converting from +-- 16bits pixels or Floating point pixels. +convertRGBA8 :: DynamicImage -> Image PixelRGBA8 +convertRGBA8 dynImage = case dynImage of + ImageY8 img -> promoteImage img + ImageY16 img -> promoteImage (decimateBitDepth img :: Image Pixel8) + ImageYF img -> promoteImage (decimateBitDepth img :: Image Pixel8) + ImageYA8 img -> promoteImage img + ImageYA16 img -> promoteImage (decimateBitDepth img :: Image PixelYA8) + ImageRGB8 img -> promoteImage img + ImageRGB16 img -> promoteImage (decimateBitDepth img :: Image PixelRGB8) + ImageRGBF img -> promoteImage (decimateBitDepth img :: Image PixelRGB8) + ImageRGBA8 img -> promoteImage img + ImageRGBA16 img -> decimateBitDepth img + ImageYCbCr8 img -> promoteImage (convertImage img :: Image PixelRGB8) + ImageCMYK8 img -> promoteImage (convertImage img :: Image PixelRGB8) + ImageCMYK16 img -> + promoteImage (convertImage (decimateBitDepth img :: Image PixelCMYK8) :: Image PixelRGB8) + +-- | Convert by any mean possible a dynamic image to an image +-- in RGB. The process can lose precision while converting from +-- 16bits pixels or Floating point pixels. Any alpha layer will +-- be dropped +convertRGB8 :: DynamicImage -> Image PixelRGB8 +convertRGB8 dynImage = case dynImage of + ImageY8 img -> promoteImage img + ImageY16 img -> promoteImage (decimateBitDepth img :: Image Pixel8) + ImageYF img -> promoteImage (decimateBitDepth img :: Image Pixel8) + ImageYA8 img -> promoteImage img + ImageYA16 img -> promoteImage (decimateBitDepth img :: Image PixelYA8) + ImageRGB8 img -> img + ImageRGB16 img -> decimateBitDepth img + ImageRGBF img -> decimateBitDepth img :: Image PixelRGB8 + ImageRGBA8 img -> dropAlphaLayer img + ImageRGBA16 img -> dropAlphaLayer (decimateBitDepth img :: Image PixelRGBA8) + ImageYCbCr8 img -> convertImage img + ImageCMYK8 img -> convertImage img + ImageCMYK16 img -> convertImage (decimateBitDepth img :: Image PixelCMYK8) + + -- | Equivalent to 'decodeImage', but also provide potential metadatas -- present in the given file. decodeImageWithMetadata :: B.ByteString -> Either String (DynamicImage, Metadatas) From 489a67b338a221a19b04089bf0a67ffef80f8434 Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Tue, 22 Dec 2015 19:13:02 +0100 Subject: [PATCH 02/15] Adding RGB/CMYK/Y output to JPG for #116 --- README.md | 4 +- changelog | 5 +- src/Codec/Picture/Jpg.hs | 419 +++++++++++++++++++++++---------- src/Codec/Picture/Jpg/Types.hs | 3 +- src/Codec/Picture/Saving.hs | 10 +- test-src/main.hs | 20 +- 6 files changed, 332 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index 47732f4..a32a1e7 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,12 @@ Status * Metadata (reading/writing): DPI information - - Jpeg (.jpg, .jpeg) + - Jpeg (.jpg, .jpeg) * Reading normal and interlaced baseline DCT image - YCbCr (default) CMYK/YCbCrK/RGB colorspaces + * Writing non-interlaced JPG + - YCbCr (favored), Y, RGB & CMYK colorspaces * Metadata: - Reading and writing DpiX & DpiY from JFIF header. diff --git a/changelog b/changelog index dbc641d..9d18e0b 100644 --- a/changelog +++ b/changelog @@ -1,9 +1,10 @@ Change log ========== -v3.2.7 2015? +v3.2.7 2016 ------------ - * adding convertRGB8 and convertRGBA8 helper functions + * Addition: convertRGB8 and convertRGBA8 helper functions + * Addition: new output colorspace for JPEG format: Y, RGB & CMYK v3.2.6.5 December 2015 ---------------------- diff --git a/src/Codec/Picture/Jpg.hs b/src/Codec/Picture/Jpg.hs index f0d2f54..7ddfa68 100644 --- a/src/Codec/Picture/Jpg.hs +++ b/src/Codec/Picture/Jpg.hs @@ -11,7 +11,9 @@ module Codec.Picture.Jpg( decodeJpeg , decodeJpegWithMetadata , encodeJpegAtQuality , encodeJpegAtQualityWithMetadata + , encodeDirectJpegAtQualityWithMetadata , encodeJpeg + , JpgEncodable ) where #if !MIN_VERSION_base(4,8,0) @@ -546,6 +548,8 @@ colorSpaceOfComponentStr s = case s of -- -- * PixelRGB8 -- +-- * PixelCMYK8 +-- -- * PixelYCbCr8 -- decodeJpeg :: B.ByteString -> Either String DynamicImage @@ -623,7 +627,8 @@ decodeJpegWithMetadata file = case runGetStrict get file of frozen <- unsafeFreezeImage fImg return (st, imageData frozen) -extractBlock :: Image PixelYCbCr8 -- ^ Source image +extractBlock :: forall s px. (PixelBaseComponent px ~ Word8) + => Image px -- ^ Source image -> MutableMacroBlock s Int16 -- ^ Mutable block where to put extracted block -> Int -- ^ Plane -> Int -- ^ X sampling factor @@ -741,6 +746,22 @@ defaultHuffmanTables = , prepareHuffmanTable AcComponent 1 defaultAcChromaHuffmanTable ] +lumaQuantTableAtQuality :: Int -> QuantificationTable +lumaQuantTableAtQuality qual = scaleQuantisationMatrix qual defaultLumaQuantizationTable + +chromaQuantTableAtQuality :: Int -> QuantificationTable +chromaQuantTableAtQuality qual = + scaleQuantisationMatrix qual defaultChromaQuantizationTable + +zigzaggedQuantificationSpec :: Int -> [JpgQuantTableSpec] +zigzaggedQuantificationSpec qual = + [ JpgQuantTableSpec { quantPrecision = 0, quantDestination = 0, quantTable = luma } + , JpgQuantTableSpec { quantPrecision = 0, quantDestination = 1, quantTable = chroma } + ] + where + luma = zigZagReorderForwardv $ lumaQuantTableAtQuality qual + chroma = zigZagReorderForwardv $ chromaQuantTableAtQuality qual + -- | Function to call to encode an image to jpeg. -- The quality factor should be between 0 and 100 (100 being -- the best quality). @@ -749,6 +770,203 @@ encodeJpegAtQuality :: Word8 -- ^ Quality factor -> L.ByteString -- ^ Encoded JPEG encodeJpegAtQuality quality = encodeJpegAtQualityWithMetadata quality mempty +-- | Record gathering all information to encode a component +-- from the source image. Previously was a huge tuple +-- burried in the code +data EncoderState = EncoderState + { _encComponentIndex :: !Int + , _encBlockWidth :: !Int + , _encBlockHeight :: !Int + , _encQuantTable :: !QuantificationTable + , _encDcHuffman :: !HuffmanWriterCode + , _encAcHuffman :: !HuffmanWriterCode + } + + +-- | Helper type class describing all JPG-encodable pixel types +class (Pixel px, PixelBaseComponent px ~ Word8) => JpgEncodable px where + additionalBlocks :: Image px -> [JpgFrame] + additionalBlocks _ = [] + + componentsOfColorSpace :: Image px -> [JpgComponent] + + encodingState :: Int -> Image px -> V.Vector EncoderState + + imageHuffmanTables :: Image px -> [(JpgHuffmanTableSpec, HuffmanPackedTree)] + imageHuffmanTables _ = defaultHuffmanTables + + scanSpecificationOfColorSpace :: Image px -> [JpgScanSpecification] + + quantTableSpec :: Image px -> Int -> [JpgQuantTableSpec] + quantTableSpec _ qual = take 1 $ zigzaggedQuantificationSpec qual + + maximumSubSamplingOf :: Image px -> Int + maximumSubSamplingOf _ = 1 + +instance JpgEncodable Pixel8 where + scanSpecificationOfColorSpace _ = + [ JpgScanSpecification { componentSelector = 1 + , dcEntropyCodingTable = 0 + , acEntropyCodingTable = 0 + } + ] + + componentsOfColorSpace _ = + [ JpgComponent { componentIdentifier = 1 + , horizontalSamplingFactor = 1 + , verticalSamplingFactor = 1 + , quantizationTableDest = 0 + } + ] + + imageHuffmanTables _ = + [ prepareHuffmanTable DcComponent 0 defaultDcLumaHuffmanTable + , prepareHuffmanTable AcComponent 0 defaultAcLumaHuffmanTable + ] + + encodingState qual _ = V.singleton EncoderState + { _encComponentIndex = 0 + , _encBlockWidth = 1 + , _encBlockHeight = 1 + , _encQuantTable = zigZagReorderForwardv $ lumaQuantTableAtQuality qual + , _encDcHuffman = makeInverseTable defaultDcLumaHuffmanTree + , _encAcHuffman = makeInverseTable defaultAcLumaHuffmanTree + } + + +instance JpgEncodable PixelYCbCr8 where + maximumSubSamplingOf _ = 2 + quantTableSpec _ qual = zigzaggedQuantificationSpec qual + scanSpecificationOfColorSpace _ = + [ JpgScanSpecification { componentSelector = 1 + , dcEntropyCodingTable = 0 + , acEntropyCodingTable = 0 + } + , JpgScanSpecification { componentSelector = 2 + , dcEntropyCodingTable = 1 + , acEntropyCodingTable = 1 + } + , JpgScanSpecification { componentSelector = 3 + , dcEntropyCodingTable = 1 + , acEntropyCodingTable = 1 + } + ] + + componentsOfColorSpace _ = + [ JpgComponent { componentIdentifier = 1 + , horizontalSamplingFactor = 2 + , verticalSamplingFactor = 2 + , quantizationTableDest = 0 + } + , JpgComponent { componentIdentifier = 2 + , horizontalSamplingFactor = 1 + , verticalSamplingFactor = 1 + , quantizationTableDest = 1 + } + , JpgComponent { componentIdentifier = 3 + , horizontalSamplingFactor = 1 + , verticalSamplingFactor = 1 + , quantizationTableDest = 1 + } + ] + + encodingState qual _ = V.fromListN 3 [lumaState, chromaState, chromaState { _encComponentIndex = 2 }] + where + lumaState = EncoderState + { _encComponentIndex = 0 + , _encBlockWidth = 2 + , _encBlockHeight = 2 + , _encQuantTable = zigZagReorderForwardv $ lumaQuantTableAtQuality qual + , _encDcHuffman = makeInverseTable defaultDcLumaHuffmanTree + , _encAcHuffman = makeInverseTable defaultAcLumaHuffmanTree + } + chromaState = EncoderState + { _encComponentIndex = 1 + , _encBlockWidth = 1 + , _encBlockHeight = 1 + , _encQuantTable = zigZagReorderForwardv $ chromaQuantTableAtQuality qual + , _encDcHuffman = makeInverseTable defaultDcChromaHuffmanTree + , _encAcHuffman = makeInverseTable defaultAcChromaHuffmanTree + } + +instance JpgEncodable PixelRGB8 where + additionalBlocks _ = [] where + _adobe14 = JpgAdobeApp14 + { _adobeDctVersion = 100 + , _adobeFlag0 = 0 + , _adobeFlag1 = 0 + , _adobeTransform = AdobeUnknown + } + + imageHuffmanTables _ = + [ prepareHuffmanTable DcComponent 0 defaultDcLumaHuffmanTable + , prepareHuffmanTable AcComponent 0 defaultAcLumaHuffmanTable + ] + + scanSpecificationOfColorSpace _ = fmap build "RGB" where + build c = JpgScanSpecification + { componentSelector = fromIntegral $ fromEnum c + , dcEntropyCodingTable = 0 + , acEntropyCodingTable = 0 + } + + componentsOfColorSpace _ = fmap build "RGB" where + build c = JpgComponent + { componentIdentifier = fromIntegral $ fromEnum c + , horizontalSamplingFactor = 1 + , verticalSamplingFactor = 1 + , quantizationTableDest = 0 + } + + encodingState qual _ = V.fromListN 3 $ fmap build [0 .. 2] where + build ix = EncoderState + { _encComponentIndex = ix + , _encBlockWidth = 1 + , _encBlockHeight = 1 + , _encQuantTable = zigZagReorderForwardv $ lumaQuantTableAtQuality qual + , _encDcHuffman = makeInverseTable defaultDcLumaHuffmanTree + , _encAcHuffman = makeInverseTable defaultAcLumaHuffmanTree + } + +instance JpgEncodable PixelCMYK8 where + additionalBlocks _ = [] where + _adobe14 = JpgAdobeApp14 + { _adobeDctVersion = 100 + , _adobeFlag0 = 32768 + , _adobeFlag1 = 0 + , _adobeTransform = AdobeYCck + } + + imageHuffmanTables _ = + [ prepareHuffmanTable DcComponent 0 defaultDcLumaHuffmanTable + , prepareHuffmanTable AcComponent 0 defaultAcLumaHuffmanTable + ] + + scanSpecificationOfColorSpace _ = fmap build "CMYK" where + build c = JpgScanSpecification + { componentSelector = fromIntegral $ fromEnum c + , dcEntropyCodingTable = 0 + , acEntropyCodingTable = 0 + } + + componentsOfColorSpace _ = fmap build "CMYK" where + build c = JpgComponent + { componentIdentifier = fromIntegral $ fromEnum c + , horizontalSamplingFactor = 1 + , verticalSamplingFactor = 1 + , quantizationTableDest = 0 + } + + encodingState qual _ = V.fromListN 4 $ fmap build [0 .. 3] where + build ix = EncoderState + { _encComponentIndex = ix + , _encBlockWidth = 1 + , _encBlockHeight = 1 + , _encQuantTable = zigZagReorderForwardv $ lumaQuantTableAtQuality qual + , _encDcHuffman = makeInverseTable defaultDcLumaHuffmanTree + , _encAcHuffman = makeInverseTable defaultAcLumaHuffmanTree + } + -- | Equivalent to 'encodeJpegAtQuality', but will store the following -- metadatas in the file using a JFIF block: -- @@ -759,121 +977,86 @@ encodeJpegAtQualityWithMetadata :: Word8 -- ^ Quality factor -> Metadatas -> Image PixelYCbCr8 -- ^ Image to encode -> L.ByteString -- ^ Encoded JPEG -encodeJpegAtQualityWithMetadata quality metas img@(Image { imageWidth = w, imageHeight = h }) = encode finalImage - where finalImage = JpgImage $ - encodeMetadatas metas ++ - [ JpgQuantTable quantTables - , JpgScans JpgBaselineDCTHuffman hdr - , JpgHuffmanTable defaultHuffmanTables - , JpgScanBlob scanHeader encodedImage - ] - - outputComponentCount = 3 - - scanHeader = scanHeader'{ scanLength = fromIntegral $ calculateSize scanHeader' } - scanHeader' = JpgScanHeader - { scanLength = 0 - , scanComponentCount = outputComponentCount - , scans = [ JpgScanSpecification { componentSelector = 1 - , dcEntropyCodingTable = 0 - , acEntropyCodingTable = 0 - } - , JpgScanSpecification { componentSelector = 2 - , dcEntropyCodingTable = 1 - , acEntropyCodingTable = 1 - } - , JpgScanSpecification { componentSelector = 3 - , dcEntropyCodingTable = 1 - , acEntropyCodingTable = 1 - } - ] - - , spectralSelection = (0, 63) - , successiveApproxHigh = 0 - , successiveApproxLow = 0 - } - - hdr = hdr' { jpgFrameHeaderLength = fromIntegral $ calculateSize hdr' } - hdr' = JpgFrameHeader { jpgFrameHeaderLength = 0 - , jpgSamplePrecision = 8 - , jpgHeight = fromIntegral h - , jpgWidth = fromIntegral w - , jpgImageComponentCount = outputComponentCount - , jpgComponents = [ - JpgComponent { componentIdentifier = 1 - , horizontalSamplingFactor = 2 - , verticalSamplingFactor = 2 - , quantizationTableDest = 0 - } - , JpgComponent { componentIdentifier = 2 - , horizontalSamplingFactor = 1 - , verticalSamplingFactor = 1 - , quantizationTableDest = 1 - } - , JpgComponent { componentIdentifier = 3 - , horizontalSamplingFactor = 1 - , verticalSamplingFactor = 1 - , quantizationTableDest = 1 - } - ] - } - - lumaQuant = scaleQuantisationMatrix (fromIntegral quality) - defaultLumaQuantizationTable - chromaQuant = scaleQuantisationMatrix (fromIntegral quality) - defaultChromaQuantizationTable - - zigzagedLumaQuant = zigZagReorderForwardv lumaQuant - zigzagedChromaQuant = zigZagReorderForwardv chromaQuant - quantTables = [ JpgQuantTableSpec { quantPrecision = 0, quantDestination = 0 - , quantTable = zigzagedLumaQuant } - , JpgQuantTableSpec { quantPrecision = 0, quantDestination = 1 - , quantTable = zigzagedChromaQuant } - ] - - encodedImage = runST $ do - let horizontalMetaBlockCount = - w `divUpward` (dctBlockSize * maxSampling) - verticalMetaBlockCount = - h `divUpward` (dctBlockSize * maxSampling) - maxSampling = 2 - lumaSamplingSize = ( maxSampling, maxSampling, zigzagedLumaQuant - , makeInverseTable defaultDcLumaHuffmanTree - , makeInverseTable defaultAcLumaHuffmanTree) - chromaSamplingSize = ( maxSampling - 1, maxSampling - 1, zigzagedChromaQuant - , makeInverseTable defaultDcChromaHuffmanTree - , makeInverseTable defaultAcChromaHuffmanTree) - componentDef = [lumaSamplingSize, chromaSamplingSize, chromaSamplingSize] - - imageComponentCount = length componentDef - - dc_table <- M.replicate 3 0 - block <- createEmptyMutableMacroBlock - workData <- createEmptyMutableMacroBlock - zigzaged <- createEmptyMutableMacroBlock - writeState <- newWriteStateRef - - -- It's ugly, I know, be avoid allocation - let blockDecoder mx my = component $ zip [0..] componentDef - where component [] = return () - component ((comp, (sizeX, sizeY, table, dc, ac)) : comp_rest) = - rasterMap sizeX sizeY decoder >> component comp_rest - where xSamplingFactor = maxSampling - sizeX + 1 - ySamplingFactor = maxSampling - sizeY + 1 - extractor = extractBlock img block xSamplingFactor ySamplingFactor imageComponentCount - - decoder subX subY = do - let blockY = my * sizeY + subY - blockX = mx * sizeX + subX - prev_dc <- dc_table `M.unsafeRead` comp - (dc_coeff, neo_block) <- extractor comp blockX blockY >>= - encodeMacroBlock table workData zigzaged prev_dc - (dc_table `M.unsafeWrite` comp) $ fromIntegral dc_coeff - serializeMacroBlock writeState dc ac neo_block - - rasterMap - horizontalMetaBlockCount verticalMetaBlockCount - blockDecoder - - finalizeBoolWriter writeState +encodeJpegAtQualityWithMetadata = encodeDirectJpegAtQualityWithMetadata + +-- | Equivalent to 'encodeJpegAtQuality', but will store the following +-- metadatas in the file using a JFIF block: +-- +-- * 'Codec.Picture.Metadata.DpiX' +-- * 'Codec.Picture.Metadata.DpiY' +-- +-- This function also allow to create JPEG files with the following color +-- space: +-- +-- * Y (Pixel8) for greyscale. +-- * RGB (PixelRGB8) with no color downsampling on any plane +-- * CMYK (PixelCMYK8) with no color downsampling on any plane +-- +encodeDirectJpegAtQualityWithMetadata :: forall px. (JpgEncodable px) + => Word8 -- ^ Quality factor + -> Metadatas + -> Image px -- ^ Image to encode + -> L.ByteString -- ^ Encoded JPEG +encodeDirectJpegAtQualityWithMetadata quality metas img = encode finalImage where + !w = imageWidth img + !h = imageHeight img + finalImage = JpgImage $ + encodeMetadatas metas ++ + additionalBlocks img ++ + [ JpgQuantTable $ quantTableSpec img (fromIntegral quality) + , JpgScans JpgBaselineDCTHuffman hdr + , JpgHuffmanTable $ imageHuffmanTables img + , JpgScanBlob scanHeader encodedImage + ] + + !outputComponentCount = componentCount (undefined :: px) + + scanHeader = scanHeader'{ scanLength = fromIntegral $ calculateSize scanHeader' } + scanHeader' = JpgScanHeader + { scanLength = 0 + , scanComponentCount = fromIntegral outputComponentCount + , scans = scanSpecificationOfColorSpace img + , spectralSelection = (0, 63) + , successiveApproxHigh = 0 + , successiveApproxLow = 0 + } + + hdr = hdr' { jpgFrameHeaderLength = fromIntegral $ calculateSize hdr' } + hdr' = JpgFrameHeader + { jpgFrameHeaderLength = 0 + , jpgSamplePrecision = 8 + , jpgHeight = fromIntegral h + , jpgWidth = fromIntegral w + , jpgImageComponentCount = fromIntegral outputComponentCount + , jpgComponents = componentsOfColorSpace img + } + + !maxSampling = maximumSubSamplingOf img + !horizontalMetaBlockCount = w `divUpward` (dctBlockSize * maxSampling) + !verticalMetaBlockCount = h `divUpward` (dctBlockSize * maxSampling) + !componentDef = encodingState (fromIntegral quality) img + + encodedImage = runST $ do + dc_table <- M.replicate outputComponentCount 0 + block <- createEmptyMutableMacroBlock + workData <- createEmptyMutableMacroBlock + zigzaged <- createEmptyMutableMacroBlock + writeState <- newWriteStateRef + + rasterMap horizontalMetaBlockCount verticalMetaBlockCount $ \mx my -> + V.forM_ componentDef $ \(EncoderState comp sizeX sizeY table dc ac) -> + let !xSamplingFactor = maxSampling - sizeX + 1 + !ySamplingFactor = maxSampling - sizeY + 1 + !extractor = extractBlock img block xSamplingFactor ySamplingFactor outputComponentCount + in + rasterMap sizeX sizeY $ \subX subY -> do + let !blockY = my * sizeY + subY + !blockX = mx * sizeX + subX + prev_dc <- dc_table `M.unsafeRead` comp + extracted <- extractor comp blockX blockY + (dc_coeff, neo_block) <- encodeMacroBlock table workData zigzaged prev_dc extracted + (dc_table `M.unsafeWrite` comp) $ fromIntegral dc_coeff + serializeMacroBlock writeState dc ac neo_block + + finalizeBoolWriter writeState diff --git a/src/Codec/Picture/Jpg/Types.hs b/src/Codec/Picture/Jpg/Types.hs index 9aa7c58..2d140e7 100644 --- a/src/Codec/Picture/Jpg/Types.hs +++ b/src/Codec/Picture/Jpg/Types.hs @@ -427,7 +427,8 @@ takeCurrentFrame = do getByteString (fromIntegral size - 2) putFrame :: JpgFrame -> Put -putFrame (JpgAdobeAPP14 _adobe) = return () +putFrame (JpgAdobeAPP14 adobe) = + put (JpgAppSegment 14) >> putWord16be 14 >> put adobe putFrame (JpgJFIF jfif) = put (JpgAppSegment 0) >> putWord16be (14+2) >> put jfif putFrame (JpgExif _exif) = diff --git a/src/Codec/Picture/Saving.hs b/src/Codec/Picture/Saving.hs index f0e8c84..bd5f64e 100644 --- a/src/Codec/Picture/Saving.hs +++ b/src/Codec/Picture/Saving.hs @@ -94,9 +94,13 @@ imageToRadiance (ImageRGBA16 img) = -- | This function will try to do anything to encode an image -- as JPEG, make all color conversion and such. Equivalent -- of 'decodeImage' for jpeg encoding +-- Save Y or YCbCr Jpeg only, all other colorspaces are converted. +-- To save a RGB or CMYK JPEG file, use the +-- 'Codec.Picture.Jpg.encodeDirectJpegAtQualityWithMetadata' function imageToJpg :: Int -> DynamicImage -> L.ByteString imageToJpg quality dynImage = let encodeAtQuality = encodeJpegAtQuality (fromIntegral quality) + encodeWithMeta = encodeDirectJpegAtQualityWithMetadata (fromIntegral quality) mempty in case dynImage of ImageYCbCr8 img -> encodeAtQuality img ImageCMYK8 img -> imageToJpg quality . ImageRGB8 $ convertImage img @@ -105,10 +109,8 @@ imageToJpg quality dynImage = ImageRGBF img -> imageToJpg quality . ImageRGB8 $ toStandardDef img ImageRGBA8 img -> encodeAtQuality (convertImage $ dropAlphaLayer img) ImageYF img -> imageToJpg quality . ImageY8 $ greyScaleToStandardDef img - ImageY8 img -> encodeAtQuality . convertImage - $ (promoteImage img :: Image PixelRGB8) - ImageYA8 img -> encodeAtQuality $ - convertImage (promoteImage $ dropAlphaLayer img :: Image PixelRGB8) + ImageY8 img -> encodeWithMeta img + ImageYA8 img -> encodeWithMeta $ dropAlphaLayer img ImageY16 img -> imageToJpg quality . ImageY8 $ from16to8 img ImageYA16 img -> imageToJpg quality . ImageYA8 $ from16to8 img ImageRGB16 img -> imageToJpg quality . ImageRGB8 $ from16to8 img diff --git a/test-src/main.hs b/test-src/main.hs index dbd619c..9673567 100644 --- a/test-src/main.hs +++ b/test-src/main.hs @@ -2,8 +2,11 @@ {-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-unused-imports #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE TypeFamilies #-} import Codec.Picture -import Codec.Picture.Jpg( encodeJpeg, encodeJpegAtQualityWithMetadata ) +import Codec.Picture.Jpg( JpgEncodable + , encodeJpeg + , encodeDirectJpegAtQualityWithMetadata ) import Codec.Picture.Gif import Codec.Picture.Tiff import System.Environment @@ -194,6 +197,11 @@ tiffValidTests = validationJpegEncode :: Image PixelYCbCr8 -> L.ByteString validationJpegEncode = encodeJpegAtQuality 100 +liberalJpegEncode :: (PixelBaseComponent px ~ Word8, JpgEncodable px) + => Image px -> L.ByteString +liberalJpegEncode = + encodeDirectJpegAtQualityWithMetadata 100 mempty + eitherDo :: Either String (IO ()) -> IO () eitherDo (Left str) = putStrLn str eitherDo (Right action) = action @@ -294,11 +302,14 @@ imgToImg path = do let rgbimg :: Image PixelRGB8 rgbimg = convertImage img png = encodePng rgbimg + jpg = encodeDirectJpegAtQualityWithMetadata 90 mempty img tiff = encodeTiff img putStrLn $ "CMYK8 : " ++ path print met putStrLn "-> PNG" L.writeFile (path ++ "._fromCMYK8.png") png + putStrLn "-> JPG" + L.writeFile (path ++ "._fromCMYK8.jpg") jpg putStrLn "-> Gif" eitherDo $ writeColorReducedGifImage (path ++ "._fromCMYK8.gif") rgbimg putStrLn "-> Tiff" @@ -306,6 +317,7 @@ imgToImg path = do Right (ImageRGB8 img, met) -> do let jpg = validationJpegEncode (convertImage img) + jpgRgb = liberalJpegEncode img png = encodePng img bmp = encodeBitmap img tga = encodeTga img @@ -316,6 +328,8 @@ imgToImg path = do L.writeFile (path ++ "._fromRGB8.bmp") bmp putStrLn "-> JPG" L.writeFile (path ++ "._fromRGB8.jpg") jpg + putStrLn "-> JPG (RGB)" + L.writeFile (path ++ ".RGB._fromRGB8.jpg") jpgRgb putStrLn "-> PNG" L.writeFile (path ++ "._fromRGB8.png") png putStrLn "-> Gif" @@ -384,7 +398,7 @@ imgToImg path = do Right (ImageY8 img, met) -> do let bmp = encodeBitmap img - jpg = validationJpegEncode . convertImage $ (promoteImage img :: Image PixelRGB8) + jpg = liberalJpegEncode img png = encodePng img tiff = encodeTiff img tga = encodeTiff img @@ -515,7 +529,7 @@ metadataTest = do L.writeFile "tests/metadata.png" $ encodePngWithMetadata metas dumbImage L.writeFile "tests/metadata.jpg" $ - encodeJpegAtQualityWithMetadata 50 metas $ convertImage dumbImage + encodeDirectJpegAtQualityWithMetadata 50 metas $ (convertImage dumbImage :: Image PixelYCbCr8) L.writeFile "tests/metadata.bmp" $ encodeBitmapWithMetadata metas dumbImage From fec4787d74be61ee0cda0a286aecb038bce5fca6 Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Tue, 22 Dec 2015 19:55:20 +0100 Subject: [PATCH 03/15] Backward compatibility strikes again, make it compilable with older GHC --- src/Codec/Picture/Saving.hs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Codec/Picture/Saving.hs b/src/Codec/Picture/Saving.hs index bd5f64e..6ae72f8 100644 --- a/src/Codec/Picture/Saving.hs +++ b/src/Codec/Picture/Saving.hs @@ -1,4 +1,5 @@ {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE CPP #-} -- | Helper functions to save dynamic images to other file format -- with automatic color space/sample format conversion done automatically. module Codec.Picture.Saving( imageToJpg @@ -10,6 +11,10 @@ module Codec.Picture.Saving( imageToJpg , imageToTga ) where +#if !MIN_VERSION_base(4,8,0) +import Data.Monoid( mempty ) +#endif + import Data.Bits( unsafeShiftR ) import Data.Word( Word8, Word16 ) import qualified Data.ByteString.Lazy as L From 1e7409ff5ebfc9b07d63806ff6fb002d2155ec1c Mon Sep 17 00:00:00 2001 From: Calvin Beck Date: Fri, 1 Jan 2016 22:15:10 -0700 Subject: [PATCH 04/15] getNextIntJpg added for fast integer decoding. Decoding JPEGs is now much faster, as this replaces the old, very slow, unpackInt code. --- src/Codec/Picture/BitWriter.hs | 50 +++++++++++++++++++++++++++++++++ src/Codec/Picture/Jpg/Common.hs | 11 ++------ 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/Codec/Picture/BitWriter.hs b/src/Codec/Picture/BitWriter.hs index 69255e6..768330b 100644 --- a/src/Codec/Picture/BitWriter.hs +++ b/src/Codec/Picture/BitWriter.hs @@ -9,6 +9,7 @@ module Codec.Picture.BitWriter( BoolReader , getNextBitsLSBFirst , getNextBitsMSBFirst , getNextBitJpg + , getNextIntJpg , setDecodedString , setDecodedStringJpg , runBoolReader @@ -33,6 +34,7 @@ import Data.STRef import Control.Monad( when ) import Control.Monad.ST( ST ) import qualified Control.Monad.Trans.State.Strict as S +import Data.Int ( Int32, Int64 ) import Data.Word( Word8, Word32 ) import Data.Bits( (.&.), (.|.), unsafeShiftR, unsafeShiftL ) @@ -42,6 +44,7 @@ import qualified Data.Vector.Storable as VS import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L + -------------------------------------------------- ---- Reader -------------------------------------------------- @@ -103,6 +106,53 @@ getNextBitJpg = do else S.put $ BoolState (idx - 1) v chain return val +{-# INLINE getNextIntJpg #-} +getNextIntJpg :: Int -> BoolReader s Int32 +getNextIntJpg 0 = return 0 +getNextIntJpg bits = do BoolState prevIdx _ _ <- S.get + let numBytes = (bits + 7 + (7 - prevIdx)) `div` 8 + bs <- getNextWord8sJpg numBytes + + -- Adjust index accordingly. + let newIdx = (prevIdx - bits) `mod` 8 + + BoolState _ v chain <- S.get + + -- Skip over escape codes if we're in a new word. + if newIdx == 7 + then setDecodedStringJpg chain + else S.put $ BoolState newIdx v chain + + -- Fix the ends of our individual bytes. + let bs' = case B.uncons bs of + Nothing -> B.empty + Just (h, rest) -> let mask = 0xFF `unsafeShiftR` (7 - prevIdx) + in B.cons (h .&. mask) newTail + where newTail = case B.unsnoc rest of + Nothing -> B.empty + Just (start, t) -> let mask = 0xFF `unsafeShiftL` newIdx + in B.snoc start (t .&. mask) + + -- Turn our ByteString into an integer. + let shiftAmount = (newIdx + 1) `mod` 8 + return $ bytesToInt shiftAmount bs' + +{-# INLINE bytesToInt #-} +bytesToInt :: Int -> B.ByteString -> Int32 +bytesToInt shiftAmount bs = fromIntegral $ (B.foldl' packStep 0 bs) `unsafeShiftR` shiftAmount + where + packStep :: Int64 -> Word8 -> Int64 + packStep acc v = (acc `unsafeShiftL` 8) .|. (fromIntegral v) + +{-# INLINE getNextWord8sJpg #-} +getNextWord8sJpg :: Int -> BoolReader s B.ByteString +getNextWord8sJpg = go B.empty + where go acc 1 = do BoolState _ v _ <- S.get + return (B.snoc acc v) + go acc n = do BoolState _ v chain <- S.get + setDecodedStringJpg chain + go (B.snoc acc v) (n-1) + {-# INLINE getNextBitMSB #-} getNextBitMSB :: BoolReader s Bool getNextBitMSB = do diff --git a/src/Codec/Picture/Jpg/Common.hs b/src/Codec/Picture/Jpg/Common.hs index 86c7c3f..07dbc88 100644 --- a/src/Codec/Picture/Jpg/Common.hs +++ b/src/Codec/Picture/Jpg/Common.hs @@ -23,11 +23,10 @@ module Codec.Picture.Jpg.Common import Control.Applicative( pure, (<$>) ) #endif -import Control.Monad( replicateM, when ) +import Control.Monad( when ) import Control.Monad.ST( ST, runST ) import Data.Bits( unsafeShiftL, unsafeShiftR, (.&.) ) import Data.Int( Int16, Int32 ) -import Data.List( foldl' ) import Data.Maybe( fromMaybe ) import Data.Word( Word8 ) import qualified Data.Vector.Storable as VS @@ -174,8 +173,7 @@ zigZagReorder zigzaged block = do -- | Unpack an int of the given size encoded from MSB to LSB. unpackInt :: Int -> BoolReader s Int32 -unpackInt bitCount = packInt <$> replicateM bitCount getNextBitJpg - +unpackInt = getNextIntJpg {-# INLINE rasterMap #-} rasterMap :: (Monad m) @@ -187,11 +185,6 @@ rasterMap width height f = liner 0 where columner x | x >= width = liner (y + 1) columner x = f x y >> columner (x + 1) -packInt :: [Bool] -> Int32 -packInt = foldl' bitStep 0 - where bitStep acc True = (acc `unsafeShiftL` 1) + 1 - bitStep acc False = acc `unsafeShiftL` 1 - pixelClamp :: Int16 -> Word8 pixelClamp n = fromIntegral . min 255 $ max 0 n From a7591073f9d1643d15f7fca42f2437e90357e14f Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Sat, 2 Jan 2016 22:28:04 +0100 Subject: [PATCH 05/15] Re-optimizing bit reading, by chunks and avoiding some allocations Only allocation left should be the recreation of a BoolState, maybe switching to a STRef would help. Fix some problem for #117 --- src/Codec/Picture/BitWriter.hs | 107 ++++++++++++++------------------- src/Codec/Picture/Gif/LZW.hs | 5 +- 2 files changed, 48 insertions(+), 64 deletions(-) diff --git a/src/Codec/Picture/BitWriter.hs b/src/Codec/Picture/BitWriter.hs index 768330b..58362f0 100644 --- a/src/Codec/Picture/BitWriter.hs +++ b/src/Codec/Picture/BitWriter.hs @@ -1,4 +1,5 @@ {-# LANGUAGE Rank2Types #-} +{-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} -- | This module implement helper functions to read & write data -- at bits level. @@ -11,6 +12,7 @@ module Codec.Picture.BitWriter( BoolReader , getNextBitJpg , getNextIntJpg , setDecodedString + , setDecodedStringMSB , setDecodedStringJpg , runBoolReader @@ -34,7 +36,7 @@ import Data.STRef import Control.Monad( when ) import Control.Monad.ST( ST ) import qualified Control.Monad.Trans.State.Strict as S -import Data.Int ( Int32, Int64 ) +import Data.Int ( Int32 ) import Data.Word( Word8, Word32 ) import Data.Bits( (.&.), (.|.), unsafeShiftR, unsafeShiftL ) @@ -96,8 +98,8 @@ byteAlignJpg = do BoolState idx _ chain <- S.get when (idx /= 7) (setDecodedStringJpg chain) -{-# INLINE getNextBitJpg #-} getNextBitJpg :: BoolReader s Bool +{-# INLINE getNextBitJpg #-} getNextBitJpg = do BoolState idx v chain <- S.get let val = (v .&. (1 `unsafeShiftL` idx)) /= 0 @@ -106,72 +108,51 @@ getNextBitJpg = do else S.put $ BoolState (idx - 1) v chain return val -{-# INLINE getNextIntJpg #-} getNextIntJpg :: Int -> BoolReader s Int32 -getNextIntJpg 0 = return 0 -getNextIntJpg bits = do BoolState prevIdx _ _ <- S.get - let numBytes = (bits + 7 + (7 - prevIdx)) `div` 8 - bs <- getNextWord8sJpg numBytes - - -- Adjust index accordingly. - let newIdx = (prevIdx - bits) `mod` 8 - - BoolState _ v chain <- S.get - - -- Skip over escape codes if we're in a new word. - if newIdx == 7 - then setDecodedStringJpg chain - else S.put $ BoolState newIdx v chain - - -- Fix the ends of our individual bytes. - let bs' = case B.uncons bs of - Nothing -> B.empty - Just (h, rest) -> let mask = 0xFF `unsafeShiftR` (7 - prevIdx) - in B.cons (h .&. mask) newTail - where newTail = case B.unsnoc rest of - Nothing -> B.empty - Just (start, t) -> let mask = 0xFF `unsafeShiftL` newIdx - in B.snoc start (t .&. mask) - - -- Turn our ByteString into an integer. - let shiftAmount = (newIdx + 1) `mod` 8 - return $ bytesToInt shiftAmount bs' - -{-# INLINE bytesToInt #-} -bytesToInt :: Int -> B.ByteString -> Int32 -bytesToInt shiftAmount bs = fromIntegral $ (B.foldl' packStep 0 bs) `unsafeShiftR` shiftAmount - where - packStep :: Int64 -> Word8 -> Int64 - packStep acc v = (acc `unsafeShiftL` 8) .|. (fromIntegral v) - -{-# INLINE getNextWord8sJpg #-} -getNextWord8sJpg :: Int -> BoolReader s B.ByteString -getNextWord8sJpg = go B.empty - where go acc 1 = do BoolState _ v _ <- S.get - return (B.snoc acc v) - go acc n = do BoolState _ v chain <- S.get - setDecodedStringJpg chain - go (B.snoc acc v) (n-1) - -{-# INLINE getNextBitMSB #-} -getNextBitMSB :: BoolReader s Bool -getNextBitMSB = do +{-# INLINE getNextIntJpg #-} +getNextIntJpg = go 0 where + go !acc !0 = return acc + go !acc !n = do BoolState idx v chain <- S.get - let val = (v .&. (1 `unsafeShiftL` (7 - idx))) /= 0 - if idx == 7 - then setDecodedString chain - else S.put $ BoolState (idx + 1) v chain - return val + let !leftBits = 1 + fromIntegral idx + if n >= leftBits then do + setDecodedStringJpg chain + let !remaining = n - leftBits + !mask = (1 `unsafeShiftL` leftBits) - 1 + !finalV = fromIntegral v .&. mask + !theseBits = finalV `unsafeShiftL` remaining + go (acc .|. theseBits) remaining + else do + let !remaining = leftBits - n + !mask = (1 `unsafeShiftL` n) - 1 + !finalV = fromIntegral v `unsafeShiftR` remaining + S.put $ BoolState (fromIntegral remaining - 1) v chain + pure $ (finalV .&. mask) .|. acc + + +setDecodedStringMSB :: B.ByteString -> BoolReader s () +setDecodedStringMSB str = case B.uncons str of + Nothing -> S.put $ BoolState 8 0 B.empty + Just (v, rest) -> S.put $ BoolState 8 v rest + {-# INLINE getNextBitsMSBFirst #-} getNextBitsMSBFirst :: Int -> BoolReader s Word32 -getNextBitsMSBFirst = aux 0 - where aux acc 0 = return acc - aux acc n = do - bit <- getNextBitMSB - let nextVal | bit = (acc `unsafeShiftL` 1) .|. 1 - | otherwise = acc `unsafeShiftL` 1 - aux nextVal (n - 1) +getNextBitsMSBFirst requested = go 0 requested where + go :: Word32 -> Int -> BoolReader s Word32 + go !acc !0 = return acc + go !acc !n = do + BoolState idx v chain <- S.get + let !leftBits = fromIntegral idx + if n >= leftBits then do + setDecodedStringMSB chain + let !theseBits = fromIntegral v `unsafeShiftL` (n - leftBits) + go (acc .|. theseBits) (n - leftBits) + else do + let !remaining = leftBits - n + !mask = (1 `unsafeShiftL` remaining) - 1 + S.put $ BoolState (fromIntegral remaining) (v .&. mask) chain + pure $ (fromIntegral v `unsafeShiftR` remaining) .|. acc {-# INLINE getNextBitsLSBFirst #-} getNextBitsLSBFirst :: Int -> BoolReader s Word32 diff --git a/src/Codec/Picture/Gif/LZW.hs b/src/Codec/Picture/Gif/LZW.hs index 8a1a605..db9bed8 100644 --- a/src/Codec/Picture/Gif/LZW.hs +++ b/src/Codec/Picture/Gif/LZW.hs @@ -72,7 +72,10 @@ isOldTiffLZW str = firstByte == 0 && secondByte == 1 decodeLzwTiff :: B.ByteString -> M.STVector s Word8 -> Int -> BoolReader s() decodeLzwTiff str outVec initialWriteIdx = do - setDecodedString str + if isOldTiffLZW str then + setDecodedString str + else + setDecodedStringMSB str let variant | isOldTiffLZW str = OldTiffVariant | otherwise = TiffVariant lzw variant 12 9 initialWriteIdx outVec From 0d0fed687d3f43e5d924aefa7b6b74ff24c8acdb Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Sat, 2 Jan 2016 23:53:43 +0100 Subject: [PATCH 06/15] Bumping changelog and hopefuly fix compilation on old GHC --- changelog | 5 +++-- src/Codec/Picture/BitWriter.hs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/changelog b/changelog index 9d18e0b..1967ec7 100644 --- a/changelog +++ b/changelog @@ -1,10 +1,11 @@ Change log ========== -v3.2.7 2016 ------------- +v3.2.7 January 2016 +------------------- * Addition: convertRGB8 and convertRGBA8 helper functions * Addition: new output colorspace for JPEG format: Y, RGB & CMYK + * Enhancement: Optimized JPG & Tiff reading (thanks to Calvin Beck) v3.2.6.5 December 2015 ---------------------- diff --git a/src/Codec/Picture/BitWriter.hs b/src/Codec/Picture/BitWriter.hs index 58362f0..35dd7dd 100644 --- a/src/Codec/Picture/BitWriter.hs +++ b/src/Codec/Picture/BitWriter.hs @@ -127,7 +127,7 @@ getNextIntJpg = go 0 where !mask = (1 `unsafeShiftL` n) - 1 !finalV = fromIntegral v `unsafeShiftR` remaining S.put $ BoolState (fromIntegral remaining - 1) v chain - pure $ (finalV .&. mask) .|. acc + return $ (finalV .&. mask) .|. acc setDecodedStringMSB :: B.ByteString -> BoolReader s () @@ -152,7 +152,7 @@ getNextBitsMSBFirst requested = go 0 requested where let !remaining = leftBits - n !mask = (1 `unsafeShiftL` remaining) - 1 S.put $ BoolState (fromIntegral remaining) (v .&. mask) chain - pure $ (fromIntegral v `unsafeShiftR` remaining) .|. acc + return $ (fromIntegral v `unsafeShiftR` remaining) .|. acc {-# INLINE getNextBitsLSBFirst #-} getNextBitsLSBFirst :: Int -> BoolReader s Word32 From f6ca764bfb871471c1d98102ff4ece9c1d088ecc Mon Sep 17 00:00:00 2001 From: Calvin Beck Date: Tue, 12 Jan 2016 17:54:10 -0700 Subject: [PATCH 07/15] Add inline for pixelMap (Pixel8 -> Pixel8). --- src/Codec/Picture/Types.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Codec/Picture/Types.hs b/src/Codec/Picture/Types.hs index 4a87cf7..692ac31 100644 --- a/src/Codec/Picture/Types.hs +++ b/src/Codec/Picture/Types.hs @@ -897,6 +897,7 @@ pixelMap :: forall a b. (Pixel a, Pixel b) {-# SPECIALIZE INLINE pixelMap :: (PixelRGB8 -> PixelRGBA8) -> Image PixelRGB8 -> Image PixelRGBA8 #-} {-# SPECIALIZE INLINE pixelMap :: (PixelRGBA8 -> PixelRGBA8) -> Image PixelRGBA8 -> Image PixelRGBA8 #-} {-# SPECIALIZE INLINE pixelMap :: (Pixel8 -> PixelRGB8) -> Image Pixel8 -> Image PixelRGB8 #-} +{-# SPECIALIZE INLINE pixelMap :: (Pixel8 -> Pixel8) -> Image Pixel8 -> Image Pixel8 #-} pixelMap f Image { imageWidth = w, imageHeight = h, imageData = vec } = Image w h pixels where sourceComponentCount = componentCount (undefined :: a) From d2df93e57fcec3c4c28e10059b76fe19acfb950b Mon Sep 17 00:00:00 2001 From: Michael Tolly Date: Mon, 4 Jan 2016 19:30:07 -0600 Subject: [PATCH 08/15] Support for decoding RGBA8 (32-bit) BMPs --- src/Codec/Picture/Bitmap.hs | 33 +++++++++++++++++++++++++++-- tests/bmp/simple_bitmap_32bits.bmp | Bin 0 -> 40138 bytes 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/bmp/simple_bitmap_32bits.bmp diff --git a/src/Codec/Picture/Bitmap.hs b/src/Codec/Picture/Bitmap.hs index 5419b35..d2f01fa 100644 --- a/src/Codec/Picture/Bitmap.hs +++ b/src/Codec/Picture/Bitmap.hs @@ -253,6 +253,34 @@ instance BmpEncodable PixelRGB8 where inner 0 0 initialIndex VS.unsafeFreeze buff +decodeImageRGBA8 :: BmpInfoHeader -> B.ByteString -> Image PixelRGBA8 +decodeImageRGBA8 (BmpInfoHeader { width = w, height = h }) str = Image wi hi stArray where + wi = fromIntegral w + hi = abs $ fromIntegral h + stArray = runST $ do + arr <- M.new (fromIntegral $ w * abs h * 4) + if h > 0 then + foldM_ (readLine arr) 0 [0 .. hi - 1] + else + foldM_ (readLine arr) 0 [hi - 1, hi - 2 .. 0] + VS.unsafeFreeze arr + + stride = linePadding 32 wi -- will be 0 + + readLine :: forall s. M.MVector s Word8 -> Int -> Int -> ST s Int + readLine arr readIndex line = inner readIndex writeIndex where + lastIndex = wi * (hi - 1 - line + 1) * 4 + writeIndex = wi * (hi - 1 - line) * 4 + + inner readIdx writeIdx | writeIdx >= lastIndex = return $ readIdx + stride + inner readIdx writeIdx = do + -- 32-bit BMP pixels are BGRA + (arr `M.unsafeWrite` writeIdx ) (str `B.index` (readIdx + 2)) + (arr `M.unsafeWrite` (writeIdx + 1)) (str `B.index` (readIdx + 1)) + (arr `M.unsafeWrite` (writeIdx + 2)) (str `B.index` readIdx ) + (arr `M.unsafeWrite` (writeIdx + 3)) (str `B.index` (readIdx + 3)) + inner (readIdx + 4) (writeIdx + 4) + decodeImageRGB8 :: BmpInfoHeader -> B.ByteString -> Image PixelRGB8 decodeImageRGB8 (BmpInfoHeader { width = w, height = h }) str = Image wi hi stArray where wi = fromIntegral w @@ -361,8 +389,9 @@ decodeBitmapWithMetadata str = flip runGetStrict str $ do let addMetadata i = (i, metadataOfHeader bmpHeader) case (bitPerPixel bmpHeader, planes bmpHeader, bitmapCompression bmpHeader) of - -- (32, 1, 0) -> {- ImageRGBA8 <$>-} fail "Meuh" - (24, 1, 0) -> return . addMetadata . ImageRGB8 $ decodeImageRGB8 bmpHeader rest + (32, 1, n) | n == 0 || n == 3 + -> return . addMetadata . ImageRGBA8 $ decodeImageRGBA8 bmpHeader rest + (24, 1, 0) -> return . addMetadata . ImageRGB8 $ decodeImageRGB8 bmpHeader rest ( 8, 1, 0) -> let indexer v = table V.! fromIntegral v in return . addMetadata . ImageRGB8 . pixelMap indexer $ decodeImageY8 bmpHeader rest diff --git a/tests/bmp/simple_bitmap_32bits.bmp b/tests/bmp/simple_bitmap_32bits.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a94a090f804bbe818f893efa29315aafb9d192a9 GIT binary patch literal 40138 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 literal 0 HcmV?d00001 From 2a6985916f3a1efc8b549b4d19029f4ce3090fc9 Mon Sep 17 00:00:00 2001 From: Oleg Grenrus Date: Mon, 18 Jan 2016 10:26:12 +0200 Subject: [PATCH 09/15] Build with GHC 8.0.1 --- .travis.yml | 6 ++++-- JuicyPixels.cabal | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 370682e..40dc41d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,8 +12,10 @@ matrix: addons: {apt: {packages: [cabal-install-1.18, ghc-7.6.3], sources: [hvr-ghc]}} - env: CABALVER=1.18 GHCVER=7.8.4 GHCOPTS="-Werror" JOPTS="-j2" addons: {apt: {packages: [cabal-install-1.18, ghc-7.8.4], sources: [hvr-ghc]}} - - env: CABALVER=head GHCVER=7.10.1 GHCOPTS="" JOPTS="-j2" - addons: {apt: {packages: [cabal-install-head, ghc-7.10.1],sources: [hvr-ghc]}} + - env: CABALVER=1.24 GHCVER=7.10.1 GHCOPTS="" JOPTS="-j2" + addons: {apt: {packages: [cabal-install-1.24, ghc-7.10.1],sources: [hvr-ghc]}} + - env: CABALVER=1.24 GHCVER=8.0.1 GHCOPTS="" JOPTS="-j2" + addons: {apt: {packages: [cabal-install-1.24, ghc-8.0.1],sources: [hvr-ghc]}} # - env: CABALVER=head GHCVER=head GHCOPTS="-Werror" JOPTS="-j2" # addons: {apt: {packages: [cabal-install-head,ghc-head], sources: [hvr-ghc]}} diff --git a/JuicyPixels.cabal b/JuicyPixels.cabal index 12ebc5f..018664f 100644 --- a/JuicyPixels.cabal +++ b/JuicyPixels.cabal @@ -43,7 +43,7 @@ Executable toPng Include-Dirs: src/Codec/Picture -- -cpp -prof -auto-all -rtsopts -caf-all -fforce-recomp Build-depends: base, - bytestring, + bytestring, JuicyPixels, mtl, MonadRandom, @@ -119,7 +119,7 @@ Library Build-depends: base >= 4.5 && < 5, bytestring >= 0.9 && < 0.11, mtl >= 1.1 && < 2.3, - binary >= 0.5 && < 0.8, + binary >= 0.5 && < 0.9, zlib >= 0.5.3.1 && < 0.7, transformers >= 0.2, vector >= 0.9 && < 0.12, From 04c3ae9ba933b8e51a21b057a94355d1aa9550e6 Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Wed, 20 Jan 2016 13:57:05 +0100 Subject: [PATCH 10/15] Doc update, README & changelog bump before release. --- README.md | 1 + changelog | 3 +++ src/Codec/Picture.hs | 2 +- src/Codec/Picture/Bitmap.hs | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a32a1e7..563fc40 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ Status - Bitmap (.bmp) (mainly used as a debug output format) * Reading + - 32bits (RGBA) images - 24bits (RGB) images - 8bits (greyscale & paletted) images diff --git a/changelog b/changelog index 1967ec7..2d90cdf 100644 --- a/changelog +++ b/changelog @@ -5,7 +5,10 @@ v3.2.7 January 2016 ------------------- * Addition: convertRGB8 and convertRGBA8 helper functions * Addition: new output colorspace for JPEG format: Y, RGB & CMYK + * Addition: RGBA8 bitmap reading (thanks to mtolly) * Enhancement: Optimized JPG & Tiff reading (thanks to Calvin Beck) + * Enhancement: INLINE SPECIALIZE for pixelMap (Pixel8 -> Pixel8) (thx to Calvin Beck) + * Fix: GHC 8.0 compilation (thanks to phadej) v3.2.6.5 December 2015 ---------------------- diff --git a/src/Codec/Picture.hs b/src/Codec/Picture.hs index e48e7db..f13c535 100644 --- a/src/Codec/Picture.hs +++ b/src/Codec/Picture.hs @@ -395,7 +395,7 @@ readGifImages = withImageDecoder decodeGifImages readJpeg :: FilePath -> IO (Either String DynamicImage) readJpeg = withImageDecoder decodeJpeg --- | Try to load a .bmp file. The colorspace would be RGB or Y. +-- | Try to load a .bmp file. The colorspace would be RGB, RGBA or Y. readBitmap :: FilePath -> IO (Either String DynamicImage) readBitmap = withImageDecoder decodeBitmap diff --git a/src/Codec/Picture/Bitmap.hs b/src/Codec/Picture/Bitmap.hs index d2f01fa..1a9d85c 100644 --- a/src/Codec/Picture/Bitmap.hs +++ b/src/Codec/Picture/Bitmap.hs @@ -350,6 +350,8 @@ metadataOfHeader hdr = -- | Try to decode a bitmap image. -- Right now this function can output the following pixel types : -- +-- * PixelRGBA8 +-- -- * PixelRGB8 -- -- * Pixel8 @@ -488,6 +490,7 @@ encodeBitmapWithPaletteAndMetadata metas pal@(BmpPalette palette) img = height = fromIntegral imgHeight, planes = 1, bitPerPixel = fromIntegral bpp, + -- TODO: put 3 for RGBA bitmapCompression = 0, -- no compression byteImageSize = imagePixelSize, xResolution = fromIntegral dpiX, From 83ca7d24330dc2c6fb47ca4a10acbe037b5063fc Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Wed, 20 Jan 2016 17:04:06 +0100 Subject: [PATCH 11/15] Adding 32bits image in the test suite --- test-src/main.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/test-src/main.hs b/test-src/main.hs index 9673567..25b9cf2 100644 --- a/test-src/main.hs +++ b/test-src/main.hs @@ -153,6 +153,7 @@ bmpValidTests :: [FilePath] bmpValidTests = ["simple_bitmap_24bits.bmp" ,"simple_bitmap_8bits.bmp" + ,"simple_bitmap_32bits.bmp" ,"eggyra0001.bmp" ,"smiley.bmp" ] From 03f89ca3545540e91a5683e5c5fa9e33cc36aa3c Mon Sep 17 00:00:00 2001 From: Calvin Beck Date: Wed, 20 Jan 2016 15:01:33 -0700 Subject: [PATCH 12/15] Removed toRational. --- src/Codec/Picture/Types.hs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Codec/Picture/Types.hs b/src/Codec/Picture/Types.hs index 692ac31..a3653ca 100644 --- a/src/Codec/Picture/Types.hs +++ b/src/Codec/Picture/Types.hs @@ -1106,9 +1106,9 @@ instance LumaPlaneExtractable PixelRGBF where instance LumaPlaneExtractable PixelRGBA8 where {-# INLINE computeLuma #-} - computeLuma (PixelRGBA8 r g b _) = floor $ 0.3 * toRational r + - 0.59 * toRational g + - 0.11 * toRational b + computeLuma (PixelRGBA8 r g b _) = floor $ 0.3 * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b instance LumaPlaneExtractable PixelYCbCr8 where {-# INLINE computeLuma #-} @@ -1571,9 +1571,9 @@ instance ColorConvertible PixelRGB16 PixelRGBA16 where instance LumaPlaneExtractable PixelRGB16 where {-# INLINE computeLuma #-} - computeLuma (PixelRGB16 r g b) = floor $ 0.3 * toRational r + - 0.59 * toRational g + - 0.11 * toRational b + computeLuma (PixelRGB16 r g b) = floor $ 0.3 * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b -------------------------------------------------- ---- PixelRGB8 instances -------------------------------------------------- @@ -1655,9 +1655,9 @@ instance ColorPlane PixelRGB8 PlaneBlue where instance LumaPlaneExtractable PixelRGB8 where {-# INLINE computeLuma #-} - computeLuma (PixelRGB8 r g b) = floor $ 0.3 * toRational r + - 0.59 * toRational g + - 0.11 * toRational b + computeLuma (PixelRGB8 r g b) = floor $ 0.3 * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b -------------------------------------------------- ---- PixelRGBA8 instances From 7a1cd01d555fbcf335559229821e839759c689b9 Mon Sep 17 00:00:00 2001 From: Michael Tolly Date: Wed, 20 Jan 2016 23:43:25 -0600 Subject: [PATCH 13/15] Fix 32-bit bitmap support --- src/Codec/Picture/Bitmap.hs | 65 ++++++++++++++++++++---------- tests/bmp/bitmap_32bits_type0.bmp | Bin 0 -> 262198 bytes 2 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 tests/bmp/bitmap_32bits_type0.bmp diff --git a/src/Codec/Picture/Bitmap.hs b/src/Codec/Picture/Bitmap.hs index 1a9d85c..499d93e 100644 --- a/src/Codec/Picture/Bitmap.hs +++ b/src/Codec/Picture/Bitmap.hs @@ -41,6 +41,7 @@ import Data.Binary.Get( Get , getWord8 , getWord16le , getWord32le + , getWord32be , bytesRead , skip ) @@ -253,8 +254,8 @@ instance BmpEncodable PixelRGB8 where inner 0 0 initialIndex VS.unsafeFreeze buff -decodeImageRGBA8 :: BmpInfoHeader -> B.ByteString -> Image PixelRGBA8 -decodeImageRGBA8 (BmpInfoHeader { width = w, height = h }) str = Image wi hi stArray where +decodeImageRGBA8 :: BmpInfoHeader -> (Int, Int, Int, Int) -> B.ByteString -> Image PixelRGBA8 +decodeImageRGBA8 (BmpInfoHeader { width = w, height = h }) (posR, posG, posB, posA) str = Image wi hi stArray where wi = fromIntegral w hi = abs $ fromIntegral h stArray = runST $ do @@ -275,10 +276,10 @@ decodeImageRGBA8 (BmpInfoHeader { width = w, height = h }) str = Image wi hi stA inner readIdx writeIdx | writeIdx >= lastIndex = return $ readIdx + stride inner readIdx writeIdx = do -- 32-bit BMP pixels are BGRA - (arr `M.unsafeWrite` writeIdx ) (str `B.index` (readIdx + 2)) - (arr `M.unsafeWrite` (writeIdx + 1)) (str `B.index` (readIdx + 1)) - (arr `M.unsafeWrite` (writeIdx + 2)) (str `B.index` readIdx ) - (arr `M.unsafeWrite` (writeIdx + 3)) (str `B.index` (readIdx + 3)) + (arr `M.unsafeWrite` writeIdx ) (str `B.index` (readIdx + posR)) + (arr `M.unsafeWrite` (writeIdx + 1)) (str `B.index` (readIdx + posG)) + (arr `M.unsafeWrite` (writeIdx + 2)) (str `B.index` (readIdx + posB)) + (arr `M.unsafeWrite` (writeIdx + 3)) (str `B.index` (readIdx + posA)) inner (readIdx + 4) (writeIdx + 4) decodeImageRGB8 :: BmpInfoHeader -> B.ByteString -> Image PixelRGB8 @@ -379,28 +380,49 @@ decodeBitmapWithMetadata str = flip runGetStrict str $ do paletteColorCount | colorCount bmpHeader == 0 = 2 ^ bpp | otherwise = fromIntegral $ colorCount bmpHeader + getData = do + readed' <- bytesRead + skip . fromIntegral $ dataOffset hdr - fromIntegral readed' + getRemainingBytes + addMetadata i = (i, metadataOfHeader bmpHeader) - table <- if bpp > 8 - then return V.empty - else V.replicateM paletteColorCount pixelGet - - readed' <- bytesRead - - skip . fromIntegral $ dataOffset hdr - fromIntegral readed' - rest <- getRemainingBytes - let addMetadata i = (i, metadataOfHeader bmpHeader) case (bitPerPixel bmpHeader, planes bmpHeader, bitmapCompression bmpHeader) of - (32, 1, n) | n == 0 || n == 3 - -> return . addMetadata . ImageRGBA8 $ decodeImageRGBA8 bmpHeader rest - (24, 1, 0) -> return . addMetadata . ImageRGB8 $ decodeImageRGB8 bmpHeader rest - ( 8, 1, 0) -> - let indexer v = table V.! fromIntegral v in - return . addMetadata . ImageRGB8 . pixelMap indexer $ decodeImageY8 bmpHeader rest + (32, 1, 0) -> do + rest <- getData + return . addMetadata . ImageRGBA8 $ decodeImageRGBA8 bmpHeader (2, 1, 0, 3) rest + -- (2, 1, 0, 3) means BGRA pixel order + (32, 1, 3) -> do + posRed <- getBitfield + posGreen <- getBitfield + posBlue <- getBitfield + posAlpha <- getBitfield + rest <- getData + return . addMetadata . ImageRGBA8 $ + decodeImageRGBA8 bmpHeader (posRed, posGreen, posBlue, posAlpha) rest + (24, 1, 0) -> do + rest <- getData + return . addMetadata . ImageRGB8 $ decodeImageRGB8 bmpHeader rest + ( 8, 1, 0) -> do + table <- V.replicateM paletteColorCount pixelGet + rest <- getData + let indexer v = table V.! fromIntegral v + return . addMetadata . ImageRGB8 . pixelMap indexer $ decodeImageY8 bmpHeader rest a -> fail $ "Can't handle BMP file " ++ show a +getBitfield :: Get Int +getBitfield = do + w32 <- getWord32be + case w32 of + 0xFF000000 -> return 0 + 0x00FF0000 -> return 1 + 0x0000FF00 -> return 2 + 0x000000FF -> return 3 + _ -> fail $ + "Codec.Picture.Bitmap.getBitfield: unsupported bitfield of " ++ show w32 + -- | Write an image in a file use the bitmap format. writeBitmap :: (BmpEncodable pixel) => FilePath -> Image pixel -> IO () @@ -490,7 +512,6 @@ encodeBitmapWithPaletteAndMetadata metas pal@(BmpPalette palette) img = height = fromIntegral imgHeight, planes = 1, bitPerPixel = fromIntegral bpp, - -- TODO: put 3 for RGBA bitmapCompression = 0, -- no compression byteImageSize = imagePixelSize, xResolution = fromIntegral dpiX, diff --git a/tests/bmp/bitmap_32bits_type0.bmp b/tests/bmp/bitmap_32bits_type0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..35f1dc6cf9d8df0f59f3fd07efe22b7d08bf3634 GIT binary patch literal 262198 zcmbTf=aZ$!m8VA%0O4(W?`>6em-pUxnYPv5ccTp&-a8T?2}6RwfB-=b2!I2S00Gc| z9F8M7zbF=!?Fsq}4x=dY*Id>ABm&>`bU4GV-;V`DW$scTAql zJ3QO|nX5nJUpr~D2cNB^&wggLXYu#jTR!s{Q~oVqytJ%czOt-dww!!LSwrses-?>! ztysFWEM2msEM2^~EF)jEU_n{DXi-^2nm2D=x#gBy%1t-jRBpWS#z>yucH3>`=9_OW zH{5VTx%S#?%XQaXSFXSQ`Z)La^Pm5Gx#pT{BKO$md@sxL9h2{vUw!q}k*>Pxs*>q* zpZi?N^l8^V``OQye=g%6qln=r`2fw-4;EdAHvleY$@2nzCu_ zy3)42u{71ymrd)|mu*|?%GM1V%f>Zp%Vy5&H*Jp8T(_;9*>|w)o0uxg`JedS^w@am zXl{w;x31q%wrt#3Hj{jRJLR-&+g=(ecMJD?e$)E(W$VUGks7vcE!(ziEe)Hu#IsvB zZ7N$x>({I)>sPESYgerIjtD8HV1>b7htn`y&l%HKaZRW2MjT-L5$Rn}4V()iSYUPUP*OPnaN-zDj zfxeg-8jkiXUbeI>U$(3)U%tGoT*-Iyj_=pg9{a{V@_%5T+Qz(=`Bv`v{5ty0{)#@M zZp&G}YE_vW7%Vg66X0iISulToX`|ojDOW5l6jw`^lqKZLXu~S|n|Ext$#U%nlmA!G zH}XF;t)=hQ(B2iix0v@AE~I=gDn2c5G3Pfk)~*5%SA&_W#l>enQ^0>D@xKP#i+A%{ z?0c;i|4S%S{4b)+`Fz9ej9+nXk^@Y6ZtfTt!^sWe-1EeBV&ckY#7lC9&(vb@)3BcS z{paw0<^6o`pUSf?^V&9eEY9;DU=#o6{`QX20cO^V z`Ar)Gua39GzIlIpSGoJxsj`1!x~yEhq_n~rduL|LHpY@%v31>s7}r}Eqhen?h+DC- zoiSYJ__a*#N7)-UUmn|*@7UVHINRvBU9qaHL>7pNb&O@p>7$M9v{4RduHgW&F6KMI zm3-r~&D7ac*AQ(Gzm8wIrw+WH0E3qfA7lKkDI3Az&dD96m-pALToupQ4tc`yE*~Wq zc%0|r+;X>*nyE8+F7fYk;%7DZSjji622(BDx0e&U_m)05tAYNR?Cmcr!P~;ci^^j7 zRNN@W6uANoz3tN6DsXLH zl<~E^AQy<0T0KGh)#B}+!fP$Q{jCKUGfc^(#4`_WYmY1^FRyZ~OhG>-fH_ ztK4CGtjqt&&GgMCups^&&&tfis^iYoy1l7P^bM2;PTv{$S;sgN_jA*;r5zqv8L|Ui z4!NCrL&#fXt}=BqWvE*?ezsK0bZm>&2C)wgSA##tQ$?<0RA) z`20nTaq?y0!gu6Bxmm15-|=19hk--B%{JR#exrRQf6PZt-g5ix0(y^S%uDlnp4R7RL9%lkXK%KjbGnmOB?O>e4cU*Jz$}7oAbrsNt;*Q+VV`+rGB2+^nAtgij4I7GQLOIdlTc| zw21QL=)v~RsONUDaT9VOHZ?+zDZKVxzA>X=| z@3bAZQGBL+HupXI#{LbRop15jXO-V#QcQ_|$B?+U&&@qo_gBAM1|P{IiGRxy|Gs~v zoUg@s;@>)aE_p$2NDjzcE=Yaf=RFo9;znF~?DfP=Vl8o(I7&R5i_bj&|AYT5GwaH{ z7WcKsdA~OIzUSt)T^-2pmjnDp?_K@|j<520o>M=#kv?%e`ac&>!;F<(nLHr_2u-&2jjF7{f8v%qd&B zugp}YizCOMwt#pPeT`2%F_Pm>*^{aU|g<{AJqS~x0S)R zXBauz*Vz@^wu15Km~||hJa$Z5cjD1=ll_q6J;%BETG}Ch^&xM&J32yN7H3P8w~S?V zh8b)R`_wilhn4^Hz>xndIbbQzXPM%`V^hjT?^>_7@&i3|bkGi$jKT|Q=gJ^#Jp{?EshKSPd+cN z%=bIEpFX_cV(taM%gOxz(%+}tNItMXmckEWzm{KYqj*mII-bRTa)Nlyl(xUm$_YN> z^CrviIge8|dM?%zGvX#OI3`w1+Fr2?HZo@ynJ{4b>(LILtJP-j`#MJE!vw^+=;8eADDLhZ^xG3!E=3G z-IX!II9SF1)92J>#iGx7?l=m)6@J)2`N~xBzJ_yg8MZz+RHqly$r0)em&>qB$0WJB zwzg=Lp{(MXI)r1>>tcVbf1nKaR=&Y;<$KC(ImS91dvb?94dtTmCAO`{@oO$WCGI`X zlo(Cb8#`>*dWZ?q1WkJ{*VpI9s+R{QB+XCxy zfV^Xp1F~#6%Q`$arH?PU$iA^J)xYH8<$ecch&i9lcki^1oztwL}9mjgErmdd`_t){w!I#_*dx-o-c;F8H zhb!UfbzoD>iV>5T+`JZ>kpH_rLuIV;TtAccblCHZ`H+p|;&C~CZgC)n6D9G?c-< zzKSkEUo8cL$}{<`VvC?lP|i~EG;ex0i5T9Lh63dk5v*4!4*G*5L%N`>n&&ZyzeJm9bvek6^w)-tb-SDL;Ha z{07|f|DY|fjc@L1ZYhoQxqTeCxt&FV=${XrehgF|&-r2IdvCaFtdtzQpzekfe!bhgPVw7@Lfmr>jH7iJ#m^?U2K`)(f7rZ$#>WB{bSC7(%*jLJpR{m zfO^M#_$k|x?FnpyKlO5Tx2@<<>*%MIeAD*z6<>_f6z`L-qE8%4+9!?$ z{}(35Sk4P1zsjN7L#YFZYm?t-yMm{LTrd3F;$DR zJkPuqvxz~UPb_*r@tJ;r+PwDtJkIB@%(Kj_JKN=XZQZup_WLd7$z|qpK>QErFS*b% z^7-J5>U%zCpP2HUlo^f%$G*P4jT<+F&ez@C8nUh*J6E|k0qzd%+EYe*`$G5De%FV1 zWm1RO0*9zi(-m#*LHtAmw^C>U9rcbdKneTkJTw>XwThd;! z?07ZTcJWvpz_Rr%DuZ{7kC#TUv=LvWeny{*XMBegJVHDCesvmibsgIu^AT`{?<{7# z%1>#hCwByQ@!oPc!7(2^2=?U#+cQWTc>bAYDMN8~foTJ-<;f6@Q#C z7x?{hK==VDJ2@%1j(X%9Ilyzrx*TDDcr5ni1e4=GZ3D-7jQ^_aPaY5-Vk>cy$DWJ3 z#J9P)&ijeU#B|>O=dhpUS5PQ?{9RqHk+w z>-!fwVl@4M;hIz1#8Y zxOYA(ai7=p$p<&#C(s8t4R>e{=u_OzJb%tPs#km6wtMV5K9k?#H;8j_pZ00q!EmH&FA&u>2DBcwX#s`iv{(a zoVWBHeIAMXcI^MGqo2MrIXBou(hl-}WUP?=7W@ZKErYu(Tbo0C24CB^>H_@##B{_% zp%bc0$=mDcf1i`{?5EKCJ?7bz`RZmS|8MC7FxMBW?x_w{>k|n5#PP^jR4#?xLY}%n z>K>^pB;Fm*%Kl7=e=#FA9QPh4KE#)@G%+b=JWjkO&b^knOw4Cqi+zvtoh$RK7zd1@l>LtPocGrcpJT!I9XtB|OrekC2k5BU=5ojw zzWa%x;j#lCgJ}|dd3oyHcZD;NXh z_*V{^#;f+jB*${f6!p!*4YpyNwgk7qX>x+|B>FD1E@iH|wHQ$sR#yn0d9^*-K=z66 zhRqJ%nj0Gt^&3O}Zz6t4nV;BKhqIlj)5!($L;3}R1K|}h4X~#nyW5F@u_z|1>iuLb%?3gpj4Zh4y`NkAHD*xm^=`AIJmTq#FjX#a6xeevtF}bO!@&$x6yxhP`2qd zVutLmTexOy$>wEjME$E{Ol3HoSAtO~y1z18-B!LxK2T5J1pc+B z^%E&e9Q%ofkmc%?j2Y#IV?>UzY`G=%d~v7@HjgptaW%;=UFgs10ouLFaOWFBZc&%H zv9^APNsh9Ow!z$Q5u4WAiu_gvCeE`CvA-DHiBGSIMPnk3WA?k$1;o8vVe&c0bl`?_ z=TUtxdBkV*JL=aH!}gDTq5MysH^;sD$3|p->IV^jz_rv%meD812`>iU^44mSxOSd0 z`pkafzL*#Lwpk3?wl(zmcKSmd-|~{{f*bIEs3WK^-a*`fHe<{ikc(Aycd;$c+Xp89 zho<#wkO%lgF8czgTYq5M1agu7)8({Le}Lu1x08#1xi7!p-0^AhSWXo0$pMKA@8>mf zlkb=(uEauMyo!I1#h`fp9JwjtXgt2cKKPgF{E6u-H_E20+UtpbbNR>Qu{>oPZLi$=>UH(wRg~pD?GOD0 zD;TSx1Bjh!3QT}i?PYmMpW9ZjV+?Zgm~E?l&-Q!G{*xcXp>qm>fAA;vT_fQ-1m$nY zKrsNe9OvFwFK|tkHoND_b?p*myf}9*BXt$)u>M$!RK1>kXdmm-Q$G^_`Y-+e7+c~0 zz%rtbc~9Nk`WAsvai4P#kyqPh`vU*`50(2N|LITrbkkb(fr?Ear?26g6Z^`3llYf| zk}HE_QxBkQztdzrj(=15QaN}0du}d19JA($1^FZUF!{s#%GJcYdEzjz$@yo*yx1ps zE$@rre+m9;F<$$Aa!%HH zdVD>(*i-I*u9`egnJo5e@tU0QX?ZRFz3;i@B=3lC@#lHoGf(X2{lucrir>U>eyh0j zy64#kd2Ijqt)BZ#zMp)OoMK z1;<$}=F?wju54GXN5bDEPPLK6zgW=^rawF4d%0f6JIYqa+*DQ(4v>l8~uw3T|jX#hhf)mKae??xc3tUW4mOLeP^s$MD#F01?-@e<$_v-8O zT%9HLchCKf#8NFbEl2#XTvCz$5l=~(EqsIhq8tpp8X1`QH=fwOk}JiEd|(oP>HyYd z|5#tPFYEW*;0e5 z2V2%@Lsf7u_BXDr_=My;ZI967D8pRcLVrTm%Ql`+A^~Y?^|DTgItjKw~h9P?YE8Qt~VBUJ?+dD zf)(+vAI-Qi<)(2zjwvycJfMF}J_xzXIL@``+p6 z^HpLeaV2(Fud3+z`aJX_>bI9$0$<=>?AN9%ahP~Cw%M_1*_P4Q!g>ra>R62NU&WZV zwpiCTurFfldXKTKY%@kU+h|=^)@S*q;HYX}>Ib#`;$J?t55#8pB6-&G{8n)pn54dx zp{b9Hf5(?;3*WqrzOI8;8|-sqE|C3OH^{LSpTK1wK$Qoqdlek04%eBUzGXnB35Yp?u9%GWQJV?W1z z^1-Ls@QL@d6;h5Tp3TK{Cd;bDlz8%9;>%;}Pt3|^iDQowvtrcaI|OYeX%7M zrC#8>VRKZU@w(?GZ5U$}#s6mNN&MGh%46}auA>~y_4~;Y-VgbY-5Zz#({e-dL*h{z z+cD_#^5$fBZ&|l|W%yeihw7^Suay0(z?a;W{(9qxw8xdh+CY|JS;+&A={!#C2Pc7l z`%T``&QbsOTx^O*<9HJzmggLR{IZOA@1-RDi^)5+^1mLr-%R@&`2U&e)vweAINnSy zA8Tg>2T-T=`YooYR}6BjUq`#ZJoEy%p)%*7o>1il`Xgm}`U zPia&MI=cRQ<-BX^owHW=??L~l*!>mzKQN8HANv6DY}TobD(2H3 z@wzE|U~tha@d&%eCPGin`8>x*;#(YvMe*;qSx=U&55aewJ5<;9J?8|(zSm621wQ8( zRHn;0W8FRB3yc3>;=lTT-#{JeEn-D%=h&{uF7y-eB%g>W_#nB!@m|XVw#V;wk0gDu zwpYDMzo)jp{s`Z(TvOsj-)3+c&xdai%*5P6b(}Tuf9t@GYo*La+Sx?^Xb*&5wTAEJ zJ+UA59r9oN*K&a4$ny#Z{o`Ij>IV7U{Yb~OD-p#lqaU<^J0^{jjPooa(J_w(`hS(gieytop%JsMU$`b!#Jvkut z{ooSb6JM5_GS^(}r#u&*eov;nmvbS8Yl(lat54L*{`5bZ zCod&O$N{c3y6L*>OMgdqIXJt!^t6Hpu$=SviEVWO zeFN`I5Q`u`rmsz|SGF%+f~*6Fw%5K$Jz3sx{MIJdRR;&KhN>3-;#dw4x6TpjOBtYl zUH_?1FfidER?7a!W~+FY3~^9#>gwpiI_pP*;8fcs`RAn_l180}8kFaG5_ z%M$OFom}9t-y_aF4ld$2IDkBKG1{jrcg*LwckE}sB}N?kfdg(kCG1JT@2OVpPl|Zp5+Aiy_Cn*b@JNQLy5< z$6~sfT)o3JFJ3ccy_Os2T+8^yh&7^4bD#S!bP{D3a}IOhe+He#F)H43+>2xJuG}<+ z(RMn%Nvcs-XHTXyqEl79o`fBfq(1Z`;r@S zE+XZtWzJ_EX5dR4fv?-Z&`mcp$9OaTG;;BzOi%2X*YbhqA#1O{KIYnMV{*i0d`GqY z`CW2=SdIA*>PL{t{z-EH{(oCnuO&wn<*F?czV>zU?+$buIb~ z*RR6nS%D8{gtY>Wd+}@%8+oiQudMW%b57z;4CgbRUwNz@A%2wE@`Szsb207n=K2Zr znaBEK@MxL(&&`ut#J4Hp0pS#{EAKPqbG}p0`eFT;hh}z`@$TM=?GCO&cO`e6iZRPF zo-lQc#Jl%wTYkT76#o&6RKR2_PzDW58}x@>=iJo?jq+Xvs2HASRJ18 zS!HIN*Wkag2LH|l)Y|=tfBUf(|KiL#OwJLSrp1xTnD*oG38Uw z9n6u%9xYYuCT3Hniu=^7y(VuMW0UKwEFqn`_Ei1kf&^S>_19=)n`5ncDI+2Ue>H3qr{QpUtA?0C@Zy<#g?%_ zjo67X{|COsy|P~U?s2XY3jA-Z#H5I+d?xW_J<66waN%5?vAfzCdEffw8gXUHc}d$~ zQvS;U$q&9KUWX{>)V}>?xU)Mj7W3H1F>$OMlasWaQ$O)Mc#8Je{o5Mxpu$$Qpip4C?A9^!LhPGZ6fuLhedfngVm2U)BNCYqC!GAo<5wK&8Bw{NEZmeQw- z;RrcA|DPTw#%!A@b^Vm#m%od;L%*ngOX4%X&2Lp+B;NDA+V*jxUweIEf4Hl+wANR~ytp@sQE@Uc#Qq=P%2@lvo?|fe z1F>o{Ce3HWs#q2i+P#(~hQ)JoO3MFMFgK3w9A$GqF)g21w{lwj!#E@Uu;@&nT_Raln^K9!j_|83u#jMzm zc~5L**V%W{rs*-}8W=ah@}I#_dVO?H+bzzoj@#Vo2UHuT>LKW6~WAp4A+wHirpKQO^<;r|Fv7WhoV&CO?)JY$zJBfeqyFTDr zIQ6>EUR5?OT2gki=T!?aFzy}bI#bu!#(W?7BzE*3_Qi8

hPfZuaEr1nc_kj1}~n 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Ⓢ5|xwdi#{!iuj<|Xvyx|x2X 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

jU}Ve|ZV{3Gu&qfc=ST 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 Date: Thu, 21 Jan 2016 10:32:41 +0100 Subject: [PATCH 14/15] Adding new bitmap in the test suite --- test-src/main.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/test-src/main.hs b/test-src/main.hs index 25b9cf2..168d233 100644 --- a/test-src/main.hs +++ b/test-src/main.hs @@ -154,6 +154,7 @@ bmpValidTests = ["simple_bitmap_24bits.bmp" ,"simple_bitmap_8bits.bmp" ,"simple_bitmap_32bits.bmp" + ,"bitmap_32bits_type0.bmp" ,"eggyra0001.bmp" ,"smiley.bmp" ] From fdbcb84532c60242659871ccbd8a8e5c807f5ddc Mon Sep 17 00:00:00 2001 From: Vincent Berthoux Date: Thu, 21 Jan 2016 10:33:03 +0100 Subject: [PATCH 15/15] Fixing introduced warnings in the last pull request --- src/Codec/Picture/Types.hs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Codec/Picture/Types.hs b/src/Codec/Picture/Types.hs index a3653ca..fbaa84e 100644 --- a/src/Codec/Picture/Types.hs +++ b/src/Codec/Picture/Types.hs @@ -1106,9 +1106,10 @@ instance LumaPlaneExtractable PixelRGBF where instance LumaPlaneExtractable PixelRGBA8 where {-# INLINE computeLuma #-} - computeLuma (PixelRGBA8 r g b _) = floor $ 0.3 * fromIntegral r + - 0.59 * fromIntegral g + - 0.11 * fromIntegral b + computeLuma (PixelRGBA8 r g b _) = + floor $ (0.3 :: Double) * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b instance LumaPlaneExtractable PixelYCbCr8 where {-# INLINE computeLuma #-} @@ -1571,9 +1572,11 @@ instance ColorConvertible PixelRGB16 PixelRGBA16 where instance LumaPlaneExtractable PixelRGB16 where {-# INLINE computeLuma #-} - computeLuma (PixelRGB16 r g b) = floor $ 0.3 * fromIntegral r + - 0.59 * fromIntegral g + - 0.11 * fromIntegral b + computeLuma (PixelRGB16 r g b) = + floor $ (0.3 :: Double) * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b + -------------------------------------------------- ---- PixelRGB8 instances -------------------------------------------------- @@ -1655,9 +1658,10 @@ instance ColorPlane PixelRGB8 PlaneBlue where instance LumaPlaneExtractable PixelRGB8 where {-# INLINE computeLuma #-} - computeLuma (PixelRGB8 r g b) = floor $ 0.3 * fromIntegral r + - 0.59 * fromIntegral g + - 0.11 * fromIntegral b + computeLuma (PixelRGB8 r g b) = + floor $ (0.3 :: Double) * fromIntegral r + + 0.59 * fromIntegral g + + 0.11 * fromIntegral b -------------------------------------------------- ---- PixelRGBA8 instances