Skip to content

Instantly share code, notes, and snippets.

@barrucadu
Last active August 29, 2015 14:06
Show Gist options
  • Save barrucadu/1d311cfb2feceda169dd to your computer and use it in GitHub Desktop.
Save barrucadu/1d311cfb2feceda169dd to your computer and use it in GitHub Desktop.
-- Initial 179e.cabal generated by cabal init. For further documentation,
-- see http://haskell.org/cabal/users-guide/
name: 179e
version: 0.1.0.0
-- synopsis:
-- description:
homepage: http://www.reddit.com/r/dailyprogrammer/comments/2ftcb8/9082014_challenge_179_easy_you_make_me_happy_when/
-- license:
license-file: LICENSE
author: Michael Walker
maintainer: [email protected]
-- copyright:
category: Graphics
build-type: Simple
-- extra-source-files:
cabal-version: >=1.10
executable 179e
main-is: Main.hs
-- other-modules:
-- other-extensions:
build-depends: base >=4.7 && <4.8
, filepath >=1.3
, JuicyPixels >=3.1
-- hs-source-dirs:
default-language: Haskell2010
module Main where
import Codec.Picture
import Codec.Picture.Types (convertImage)
import Control.Applicative ((<$>))
import Data.Char (toLower)
import System.Environment (getArgs)
import System.FilePath (splitExtension)
main :: IO ()
main = do
args <- getArgs
case args of
["lightness", file] -> transform lightnessTransform file
["average", file] -> transform averageTransform file
["luminosity", file] -> transform luminosityTransform file
["red", file] -> transform redTransform file
["green", file] -> transform greenTransform file
["blue", file] -> transform blueTransform file
[file] -> transform luminosityTransform file
_ -> putStrLn "USAGE: [(lightness|average|luminosity|red|green|blue)] <file>"
type ImageTransform = Image PixelRGB8 -> Image PixelRGB8
type PixelTransform = (Int, Int, Int) -> Int
lightnessTransform :: PixelTransform
lightnessTransform (r, g, b) = (maximum [r, g, b] + minimum [r, g, b]) `div` 2
averageTransform :: PixelTransform
averageTransform (r, g, b) = (r + g + b) `div` 3
luminosityTransform :: PixelTransform
luminosityTransform (r, g, b) = ceiling $ 0.21 * fromIntegral r + 0.72 * fromIntegral g + 0.07 * fromIntegral b
redTransform :: PixelTransform
redTransform (r, _, _) = r
greenTransform :: PixelTransform
greenTransform (_, g, _) = g
blueTransform :: PixelTransform
blueTransform (_, _, b) = b
transform :: PixelTransform -> FilePath -> IO ()
transform pf fp = do
img <- readImage fp
case img of
Right (ImageCMYK8 img') -> go $ convertImage img'
Right (ImageYCbCr8 img') -> go $ convertImage img'
Right (ImageRGB8 img') -> go img'
Right _ -> putStrLn "Unsupported colour depth"
Left str -> putStrLn str
where
go img = maybe (putStrLn "Unknown image type") (transform img) $ lookup ext savefs
transform img f = f (base ++ "-grey" ++ ext) . ImageRGB8 $ expand pf img
(base, ext) = map toLower <$> splitExtension fp
savefs = [ (".bmp", saveBmpImage)
, (".jpg", saveJpgImage 1000)
, (".jpeg", saveJpgImage 1000)
, (".png", savePngImage)
, (".tiff", saveTiffImage)
, (".hdr", saveRadianceImage)
]
expand :: PixelTransform -> ImageTransform
expand pf = pixelMap $ \(PixelRGB8 r g b) ->
let r' = fromIntegral r
g' = fromIntegral g
b' = fromIntegral b
v = fromIntegral $ pf (r', g', b')
in PixelRGB8 v v v
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment