{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Main (main) where
import Codec.Picture
import Codec.Picture.Types
import Data.Word (Word8)
import Language.Halide
import Language.Halide.JuicyPixels
import System.IO.Unsafe (unsafePerformIO)
import Prelude hiding (min)
brighten :: Expr Float -> Parameter 3 Word8 -> IO (Function 3 Word8)
brighten factor input = do
[x, y, c] <- mapM mkVar ["x", "y", "c"]
let value = cast . min 255 . (factor *) . cast $ input ! (c, x, y)
define "brighter" (c, x, y) value
main :: IO ()
main = do
kernel <- compile brighten
readImage "test/cat.jpg" >>= \case
Right image -> do
let rgb@(Image width height _) = convertRGB8 image
output <- newMutableImage width height
withHalideBuffer @3 @Word8 rgb $ \input ->
withHalideBuffer @3 @Word8 output $ \output' ->
kernel 2.5 input output'
savePngImage "test.png" . ImageRGB8 =<< unsafeFreezeImage output
Left e -> error e