{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

-- | Helper functions to save dynamic images to other file format,
-- while preserving metadata when possible.
--
-- This module is modified from `Codec.Picture.Saving` from JuicyPixels
module Codec.Picture.Saving.WithMetadata
  ( imageToJpgWithMetadata,
    imageToPngWithMetadata,
    imageToBitmapWithMetadata,
  )
where

import Codec.Picture.Bitmap (encodeBitmapWithMetadata)
import Codec.Picture.Jpg (encodeDirectJpegAtQualityWithMetadata, encodeJpegAtQualityWithMetadata)
import Codec.Picture.Metadata (Metadatas)
import Codec.Picture.Png (PngSavable (encodePngWithMetadata))
import Codec.Picture.Types
  ( ColorConvertible (promoteImage),
    ColorSpaceConvertible (convertImage),
    DynamicImage (..),
    Image (..),
    Pixel (PixelBaseComponent),
    Pixel8,
    PixelF,
    PixelRGB16,
    PixelRGB8 (..),
    PixelRGBA8,
    PixelRGBF (..),
    dropAlphaLayer,
    pixelMap,
  )
import Data.Bits (unsafeShiftR)
import qualified Data.ByteString.Lazy as L
import qualified Data.Vector.Storable as V
import Data.Word (Word16, Word32, Word8)

componentToLDR :: Float -> Word8
componentToLDR :: Float -> Word8
componentToLDR = Float -> Word8
forall b. Integral b => Float -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Word8) -> (Float -> Float) -> Float -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Float
255 Float -> Float -> Float
forall a. Num a => a -> a -> a
*) (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float -> Float
forall a. Ord a => a -> a -> a
min Float
1.0 (Float -> Float) -> (Float -> Float) -> Float -> Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Float -> Float
forall a. Ord a => a -> a -> a
max Float
0.0

toStandardDef :: Image PixelRGBF -> Image PixelRGB8
toStandardDef :: Image PixelRGBF -> Image PixelRGB8
toStandardDef = (PixelRGBF -> PixelRGB8) -> Image PixelRGBF -> Image PixelRGB8
forall a b. (Pixel a, Pixel b) => (a -> b) -> Image a -> Image b
pixelMap PixelRGBF -> PixelRGB8
pixelConverter
  where
    pixelConverter :: PixelRGBF -> PixelRGB8
pixelConverter (PixelRGBF Float
rf Float
gf Float
bf) = Word8 -> Word8 -> Word8 -> PixelRGB8
PixelRGB8 Word8
r Word8
g Word8
b
      where
        r :: Word8
r = Float -> Word8
componentToLDR Float
rf
        g :: Word8
g = Float -> Word8
componentToLDR Float
gf
        b :: Word8
b = Float -> Word8
componentToLDR Float
bf

greyScaleToStandardDef :: Image PixelF -> Image Pixel8
greyScaleToStandardDef :: Image Float -> Image Word8
greyScaleToStandardDef = (Float -> Word8) -> Image Float -> Image Word8
forall a b. (Pixel a, Pixel b) => (a -> b) -> Image a -> Image b
pixelMap Float -> Word8
componentToLDR

from16to8 ::
  ( PixelBaseComponent source ~ Word16,
    PixelBaseComponent dest ~ Word8
  ) =>
  Image source ->
  Image dest
from16to8 :: forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8
  Image
    { imageWidth :: forall a. Image a -> Int
imageWidth = Int
w,
      imageHeight :: forall a. Image a -> Int
imageHeight = Int
h,
      imageData :: forall a. Image a -> Vector (PixelBaseComponent a)
imageData = Vector (PixelBaseComponent source)
arr
    } = Int -> Int -> Vector (PixelBaseComponent dest) -> Image dest
forall a. Int -> Int -> Vector (PixelBaseComponent a) -> Image a
Image Int
w Int
h Vector Word8
Vector (PixelBaseComponent dest)
transformed
    where
      transformed :: Vector Word8
transformed = (Pixel16 -> Word8) -> Vector Pixel16 -> Vector Word8
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
V.map Pixel16 -> Word8
forall {a} {b}. (Integral a, Bits a, Num b) => a -> b
toWord8 Vector Pixel16
Vector (PixelBaseComponent source)
arr
      toWord8 :: a -> b
toWord8 a
v = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
v a -> Int -> a
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
8)

from32to8 ::
  ( PixelBaseComponent source ~ Word32,
    PixelBaseComponent dest ~ Word8
  ) =>
  Image source ->
  Image dest
from32to8 :: forall source dest.
(PixelBaseComponent source ~ Pixel32,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from32to8
  Image
    { imageWidth :: forall a. Image a -> Int
imageWidth = Int
w,
      imageHeight :: forall a. Image a -> Int
imageHeight = Int
h,
      imageData :: forall a. Image a -> Vector (PixelBaseComponent a)
imageData = Vector (PixelBaseComponent source)
arr
    } = Int -> Int -> Vector (PixelBaseComponent dest) -> Image dest
forall a. Int -> Int -> Vector (PixelBaseComponent a) -> Image a
Image Int
w Int
h Vector Word8
Vector (PixelBaseComponent dest)
transformed
    where
      transformed :: Vector Word8
transformed = (Pixel32 -> Word8) -> Vector Pixel32 -> Vector Word8
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
V.map Pixel32 -> Word8
forall {a} {b}. (Integral a, Bits a, Num b) => a -> b
toWord8 Vector Pixel32
Vector (PixelBaseComponent source)
arr
      toWord8 :: a -> b
toWord8 a
v = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
v a -> Int -> a
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
24)

from32to16 ::
  ( PixelBaseComponent source ~ Word32,
    PixelBaseComponent dest ~ Word16
  ) =>
  Image source ->
  Image dest
from32to16 :: forall source dest.
(PixelBaseComponent source ~ Pixel32,
 PixelBaseComponent dest ~ Pixel16) =>
Image source -> Image dest
from32to16
  Image
    { imageWidth :: forall a. Image a -> Int
imageWidth = Int
w,
      imageHeight :: forall a. Image a -> Int
imageHeight = Int
h,
      imageData :: forall a. Image a -> Vector (PixelBaseComponent a)
imageData = Vector (PixelBaseComponent source)
arr
    } = Int -> Int -> Vector (PixelBaseComponent dest) -> Image dest
forall a. Int -> Int -> Vector (PixelBaseComponent a) -> Image a
Image Int
w Int
h Vector Pixel16
Vector (PixelBaseComponent dest)
transformed
    where
      transformed :: Vector Pixel16
transformed = (Pixel32 -> Pixel16) -> Vector Pixel32 -> Vector Pixel16
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
V.map Pixel32 -> Pixel16
forall {a} {b}. (Integral a, Bits a, Num b) => a -> b
toWord16 Vector Pixel32
Vector (PixelBaseComponent source)
arr
      toWord16 :: a -> b
toWord16 a
v = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a
v a -> Int -> a
forall a. Bits a => a -> Int -> a
`unsafeShiftR` Int
16)

-- | 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.Internal.encodeDirectJpegAtQualityWithMetadata' function
imageToJpgWithMetadata :: Int -> Metadatas -> DynamicImage -> L.ByteString
imageToJpgWithMetadata :: Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta DynamicImage
dynImage =
  let encodeAtQuality :: Image PixelYCbCr8 -> ByteString
encodeAtQuality = Word8 -> Metadatas -> Image PixelYCbCr8 -> ByteString
encodeJpegAtQualityWithMetadata (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
quality) Metadatas
meta
      encodeWithMeta :: Image Word8 -> ByteString
encodeWithMeta = Word8 -> Metadatas -> Image Word8 -> ByteString
forall px.
JpgEncodable px =>
Word8 -> Metadatas -> Image px -> ByteString
encodeDirectJpegAtQualityWithMetadata (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
quality) Metadatas
meta
   in case DynamicImage
dynImage of
        ImageYCbCr8 Image PixelYCbCr8
img -> Image PixelYCbCr8 -> ByteString
encodeAtQuality Image PixelYCbCr8
img
        ImageCMYK8 Image PixelCMYK8
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB8 -> DynamicImage)
-> Image PixelRGB8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB8 -> DynamicImage
ImageRGB8 (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelCMYK8 -> Image PixelRGB8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK8
img
        ImageCMYK16 Image PixelCMYK16
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB16 -> DynamicImage)
-> Image PixelRGB16
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB16 -> DynamicImage
ImageRGB16 (Image PixelRGB16 -> ByteString) -> Image PixelRGB16 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelCMYK16 -> Image PixelRGB16
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK16
img
        ImageRGB8 Image PixelRGB8
img -> Image PixelYCbCr8 -> ByteString
encodeAtQuality (Image PixelRGB8 -> Image PixelYCbCr8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelRGB8
img)
        ImageRGBF Image PixelRGBF
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB8 -> DynamicImage)
-> Image PixelRGB8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB8 -> DynamicImage
ImageRGB8 (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGBF -> Image PixelRGB8
toStandardDef Image PixelRGBF
img
        ImageRGBA8 Image PixelRGBA8
img -> Image PixelYCbCr8 -> ByteString
encodeAtQuality (Image PixelRGB8 -> Image PixelYCbCr8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage (Image PixelRGB8 -> Image PixelYCbCr8)
-> Image PixelRGB8 -> Image PixelYCbCr8
forall a b. (a -> b) -> a -> b
$ Image PixelRGBA8 -> Image PixelRGB8
forall a b. TransparentPixel a b => Image a -> Image b
dropAlphaLayer Image PixelRGBA8
img)
        ImageYF Image Float
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image Word8 -> DynamicImage) -> Image Word8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Word8 -> DynamicImage
ImageY8 (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Float -> Image Word8
greyScaleToStandardDef Image Float
img
        ImageY8 Image Word8
img -> Image Word8 -> ByteString
encodeWithMeta Image Word8
img
        ImageYA8 Image PixelYA8
img -> Image Word8 -> ByteString
encodeWithMeta (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelYA8 -> Image Word8
forall a b. TransparentPixel a b => Image a -> Image b
dropAlphaLayer Image PixelYA8
img
        ImageY16 Image Pixel16
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image Word8 -> DynamicImage) -> Image Word8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Word8 -> DynamicImage
ImageY8 (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Pixel16 -> Image Word8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image Pixel16
img
        ImageYA16 Image PixelYA16
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelYA8 -> DynamicImage) -> Image PixelYA8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelYA8 -> DynamicImage
ImageYA8 (Image PixelYA8 -> ByteString) -> Image PixelYA8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelYA16 -> Image PixelYA8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelYA16
img
        ImageY32 Image Pixel32
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image Word8 -> DynamicImage) -> Image Word8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Word8 -> DynamicImage
ImageY8 (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Pixel32 -> Image Word8
forall source dest.
(PixelBaseComponent source ~ Pixel32,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from32to8 Image Pixel32
img
        ImageRGB16 Image PixelRGB16
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB8 -> DynamicImage)
-> Image PixelRGB8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB8 -> DynamicImage
ImageRGB8 (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGB16 -> Image PixelRGB8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelRGB16
img
        ImageRGBA16 Image PixelRGBA16
img -> Int -> Metadatas -> DynamicImage -> ByteString
imageToJpgWithMetadata Int
quality Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGBA8 -> DynamicImage)
-> Image PixelRGBA8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGBA8 -> DynamicImage
ImageRGBA8 (Image PixelRGBA8 -> ByteString) -> Image PixelRGBA8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGBA16 -> Image PixelRGBA8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelRGBA16
img

-- | This function will try to do anything to encode an image
-- as PNG, make all color conversion and such. Equivalent
-- of 'decodeImage' for PNG encoding
imageToPngWithMetadata :: Metadatas -> DynamicImage -> L.ByteString
imageToPngWithMetadata :: Metadatas -> DynamicImage -> ByteString
imageToPngWithMetadata Metadatas
meta (ImageYCbCr8 Image PixelYCbCr8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta (Image PixelYCbCr8 -> Image PixelRGB8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelYCbCr8
img :: Image PixelRGB8)
imageToPngWithMetadata Metadatas
meta (ImageCMYK8 Image PixelCMYK8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta (Image PixelCMYK8 -> Image PixelRGB8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK8
img :: Image PixelRGB8)
imageToPngWithMetadata Metadatas
meta (ImageCMYK16 Image PixelCMYK16
img) = Metadatas -> Image PixelRGB16 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta (Image PixelCMYK16 -> Image PixelRGB16
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK16
img :: Image PixelRGB16)
imageToPngWithMetadata Metadatas
meta (ImageRGB8 Image PixelRGB8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelRGB8
img
imageToPngWithMetadata Metadatas
meta (ImageRGBF Image PixelRGBF
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGBF -> Image PixelRGB8
toStandardDef Image PixelRGBF
img
imageToPngWithMetadata Metadatas
meta (ImageRGBA8 Image PixelRGBA8
img) = Metadatas -> Image PixelRGBA8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelRGBA8
img
imageToPngWithMetadata Metadatas
meta (ImageY8 Image Word8
img) = Metadatas -> Image Word8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image Word8
img
imageToPngWithMetadata Metadatas
meta (ImageYF Image Float
img) = Metadatas -> Image Word8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Float -> Image Word8
greyScaleToStandardDef Image Float
img
imageToPngWithMetadata Metadatas
meta (ImageYA8 Image PixelYA8
img) = Metadatas -> Image PixelYA8 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelYA8
img
imageToPngWithMetadata Metadatas
meta (ImageY16 Image Pixel16
img) = Metadatas -> Image Pixel16 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image Pixel16
img
imageToPngWithMetadata Metadatas
meta (ImageY32 Image Pixel32
img) = Metadatas -> DynamicImage -> ByteString
imageToPngWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image Pixel16 -> DynamicImage) -> Image Pixel16 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Pixel16 -> DynamicImage
ImageY16 (Image Pixel16 -> ByteString) -> Image Pixel16 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Pixel32 -> Image Pixel16
forall source dest.
(PixelBaseComponent source ~ Pixel32,
 PixelBaseComponent dest ~ Pixel16) =>
Image source -> Image dest
from32to16 Image Pixel32
img
imageToPngWithMetadata Metadatas
meta (ImageYA16 Image PixelYA16
img) = Metadatas -> Image PixelYA16 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelYA16
img
imageToPngWithMetadata Metadatas
meta (ImageRGB16 Image PixelRGB16
img) = Metadatas -> Image PixelRGB16 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelRGB16
img
imageToPngWithMetadata Metadatas
meta (ImageRGBA16 Image PixelRGBA16
img) = Metadatas -> Image PixelRGBA16 -> ByteString
forall a. PngSavable a => Metadatas -> Image a -> ByteString
encodePngWithMetadata Metadatas
meta Image PixelRGBA16
img

-- | This function will try to do anything to encode an image
-- as bitmap, make all color conversion and such. Equivalent
-- of 'decodeImage' for Bitmap encoding
imageToBitmapWithMetadata :: Metadatas -> DynamicImage -> L.ByteString
imageToBitmapWithMetadata :: Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (ImageYCbCr8 Image PixelYCbCr8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta (Image PixelYCbCr8 -> Image PixelRGB8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelYCbCr8
img :: Image PixelRGB8)
imageToBitmapWithMetadata Metadatas
meta (ImageCMYK8 Image PixelCMYK8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta (Image PixelCMYK8 -> Image PixelRGB8
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK8
img :: Image PixelRGB8)
imageToBitmapWithMetadata Metadatas
meta (ImageCMYK16 Image PixelCMYK16
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB16 -> DynamicImage)
-> Image PixelRGB16
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB16 -> DynamicImage
ImageRGB16 (Image PixelRGB16 -> ByteString) -> Image PixelRGB16 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelCMYK16 -> Image PixelRGB16
forall a b. ColorSpaceConvertible a b => Image a -> Image b
convertImage Image PixelCMYK16
img
imageToBitmapWithMetadata Metadatas
meta (ImageRGBF Image PixelRGBF
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGBF -> Image PixelRGB8
toStandardDef Image PixelRGBF
img
imageToBitmapWithMetadata Metadatas
meta (ImageRGB8 Image PixelRGB8
img) = Metadatas -> Image PixelRGB8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta Image PixelRGB8
img
imageToBitmapWithMetadata Metadatas
meta (ImageRGBA8 Image PixelRGBA8
img) = Metadatas -> Image PixelRGBA8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta Image PixelRGBA8
img
imageToBitmapWithMetadata Metadatas
meta (ImageY8 Image Word8
img) = Metadatas -> Image Word8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta Image Word8
img
imageToBitmapWithMetadata Metadatas
meta (ImageYF Image Float
img) = Metadatas -> Image Word8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Float -> Image Word8
greyScaleToStandardDef Image Float
img
imageToBitmapWithMetadata Metadatas
meta (ImageYA8 Image PixelYA8
img) = Metadatas -> Image PixelRGBA8 -> ByteString
forall pixel.
BmpEncodable pixel =>
Metadatas -> Image pixel -> ByteString
encodeBitmapWithMetadata Metadatas
meta (Image PixelYA8 -> Image PixelRGBA8
forall a b. ColorConvertible a b => Image a -> Image b
promoteImage Image PixelYA8
img :: Image PixelRGBA8)
imageToBitmapWithMetadata Metadatas
meta (ImageY16 Image Pixel16
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image Word8 -> DynamicImage) -> Image Word8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Word8 -> DynamicImage
ImageY8 (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Pixel16 -> Image Word8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image Pixel16
img
imageToBitmapWithMetadata Metadatas
meta (ImageY32 Image Pixel32
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image Word8 -> DynamicImage) -> Image Word8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image Word8 -> DynamicImage
ImageY8 (Image Word8 -> ByteString) -> Image Word8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image Pixel32 -> Image Word8
forall source dest.
(PixelBaseComponent source ~ Pixel32,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from32to8 Image Pixel32
img
imageToBitmapWithMetadata Metadatas
meta (ImageYA16 Image PixelYA16
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelYA8 -> DynamicImage) -> Image PixelYA8 -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelYA8 -> DynamicImage
ImageYA8 (Image PixelYA8 -> ByteString) -> Image PixelYA8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelYA16 -> Image PixelYA8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelYA16
img
imageToBitmapWithMetadata Metadatas
meta (ImageRGB16 Image PixelRGB16
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGB8 -> DynamicImage)
-> Image PixelRGB8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGB8 -> DynamicImage
ImageRGB8 (Image PixelRGB8 -> ByteString) -> Image PixelRGB8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGB16 -> Image PixelRGB8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelRGB16
img
imageToBitmapWithMetadata Metadatas
meta (ImageRGBA16 Image PixelRGBA16
img) = Metadatas -> DynamicImage -> ByteString
imageToBitmapWithMetadata Metadatas
meta (DynamicImage -> ByteString)
-> (Image PixelRGBA8 -> DynamicImage)
-> Image PixelRGBA8
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Image PixelRGBA8 -> DynamicImage
ImageRGBA8 (Image PixelRGBA8 -> ByteString) -> Image PixelRGBA8 -> ByteString
forall a b. (a -> b) -> a -> b
$ Image PixelRGBA16 -> Image PixelRGBA8
forall source dest.
(PixelBaseComponent source ~ Pixel16,
 PixelBaseComponent dest ~ Word8) =>
Image source -> Image dest
from16to8 Image PixelRGBA16
img