Last active
August 29, 2015 14:06
-
-
Save barrucadu/1d311cfb2feceda169dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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