Last active
August 29, 2015 14:11
-
-
Save JLimperg/03e460d8061ac67bf97a to your computer and use it in GitHub Desktop.
friday usage sample
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 ImageTest where | |
import Control.Monad | |
import Data.Functor | |
import Vision.Image.RGB -- [1] | |
import Vision.Image.Storage | |
import Vision.Image.Type | |
import Vision.Primitive.Shape | |
-- [1] For convenience, you can also just import Vision.Image, which | |
-- reexports the whole friday API. | |
imgPath :: FilePath | |
imgPath = "./test.png" | |
loadImg :: IO (Either StorageError StorageImage) | |
loadImg = load Nothing imgPath -- [2] | |
-- [2] The `Maybe` argument allows you to specify how your input image | |
-- is supposed to be encoded. Since I don't care, I didn't specify | |
-- anything here. | |
convertImg :: StorageImage -> RGB | |
convertImg = convert | |
middlePixel :: (Image i) => i -> ImagePixel i | |
middlePixel img = index img middle | |
where | |
Z :. height :. width = shape img -- [3] | |
middle = ix2 (height `div` 2) (width `div` 2) -- [4] | |
-- [3] `Z :. height :. width` pattern matches on friday's slightly | |
-- complex representation of a point. It is created using | |
-- the constructors `Z` and `:.` and has type `DIM2`. This encoding | |
-- is similar to Peano numbers, with `Z` corresponding to the zero | |
-- constructor and `:.` corresponding to `successor`, only written | |
-- as an infix operator. | |
-- [4] `ix2` creates a `DIM2` value. This is equivalent to | |
-- Z :. height :. width. | |
isMoreRedThanGreen :: RGBPixel -> Bool | |
isMoreRedThanGreen (RGBPixel red green _) = red >= green | |
main :: IO () | |
main = either reportError processImg =<< loadImg | |
where | |
processImg :: StorageImage -> IO () | |
processImg = putStrLn . middlePixelMsg . middlePixel . convertImg | |
where | |
middlePixelMsg px | |
| isMoreRedThanGreen px = "Middle is more red than green." | |
| otherwise = "Middle is more green than red." | |
reportError :: StorageError -> IO () | |
reportError err = putStrLn $ "Failed to open image: " ++ show err |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment