module Hakyll.Images.CompressJpg
( JpgQuality,
compressJpgCompiler,
compressJpg,
)
where
import Codec.Picture.Jpg (decodeJpeg)
import Codec.Picture.Saving (imageToJpg)
import Data.ByteString.Lazy (toStrict)
import Hakyll.Core.Compiler (Compiler)
import Hakyll.Core.Item (Item (..))
import Hakyll.Images.Common
( Image (..),
ImageFormat (..),
format,
image,
)
type JpgQuality = Int
compressJpg :: JpgQuality -> Image -> Image
compressJpg :: JpgQuality -> Image -> Image
compressJpg JpgQuality
quality Image
src =
if (Image -> ImageFormat
format Image
src) ImageFormat -> ImageFormat -> Bool
forall a. Eq a => a -> a -> Bool
/= ImageFormat
Jpeg
then [Char] -> Image
forall a. HasCallStack => [Char] -> a
error ([Char] -> Image) -> [Char] -> Image
forall a b. (a -> b) -> a -> b
$ [Char]
"Image is not a JPEG."
else case ByteString -> Either [Char] DynamicImage
decodeJpeg (ByteString -> Either [Char] DynamicImage)
-> ByteString -> Either [Char] DynamicImage
forall a b. (a -> b) -> a -> b
$ Image -> ByteString
image Image
src of
Left [Char]
_ -> [Char] -> Image
forall a. HasCallStack => [Char] -> a
error ([Char] -> Image) -> [Char] -> Image
forall a b. (a -> b) -> a -> b
$ [Char]
"Loading the image failed."
Right DynamicImage
dynImage ->
if (JpgQuality
quality JpgQuality -> JpgQuality -> Bool
forall a. Ord a => a -> a -> Bool
< JpgQuality
0 Bool -> Bool -> Bool
|| JpgQuality
quality JpgQuality -> JpgQuality -> Bool
forall a. Ord a => a -> a -> Bool
> JpgQuality
100)
then [Char] -> Image
forall a. HasCallStack => [Char] -> a
error ([Char] -> Image) -> [Char] -> Image
forall a b. (a -> b) -> a -> b
$ [Char]
"JPEG encoding quality should be between 0 and 100."
else ImageFormat -> ByteString -> Image
Image ImageFormat
Jpeg (ByteString -> Image) -> ByteString -> Image
forall a b. (a -> b) -> a -> b
$ (ByteString -> ByteString
toStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ JpgQuality -> DynamicImage -> ByteString
imageToJpg JpgQuality
quality DynamicImage
dynImage)
compressJpgCompiler :: JpgQuality -> Item Image -> Compiler (Item Image)
compressJpgCompiler :: JpgQuality -> Item Image -> Compiler (Item Image)
compressJpgCompiler JpgQuality
quality = Item Image -> Compiler (Item Image)
forall (m :: * -> *) a. Monad m => a -> m a
return (Item Image -> Compiler (Item Image))
-> (Item Image -> Item Image)
-> Item Image
-> Compiler (Item Image)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Image -> Image) -> Item Image -> Item Image
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (JpgQuality -> Image -> Image
compressJpg JpgQuality
quality)