packages feed

imagemagick-0.0.1: examples/clipmask.hs

{-# LANGUAGE OverloadedStrings #-}
-- | http://www.imagemagick.org/discourse-server/viewtopic.php?f=10&t=12285
-- and more recently: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=16783
-- http://www.imagemagick.org/Usage/channels/#masked_compose
-- Replicate a masked composite:
--  convert -size 100x100 tile:tile_water.jpg tile:tile_disks.jpg \
--    mask_bite.png -composite compose_masked.png
--

import           Graphics.ImageMagick.MagickWand
import           Graphics.ImageMagick.MagickCore

main = do
  -- MagickWand *dest = NULL, *src = NULL, *mask = NULL;

  withMagickWandGenesis $ do

    -- Create the wands
    (_,dest) <- magickWand
    (_,mask) <- magickWand
    (_,src)  <- magickWand

    setSize dest 100 100
    setSize src 100 100

    readImage dest "tile:tile_water.jpg" -- tile: ?
    readImage mask "mask_bite.png"       -- ?

    -- When you create a mask, you use white for those parts that you want
    -- to show through and black for those which must not show through.
    -- But internally it's the opposite so the mask must be negated

    negateImage mask False
    setImageClipMask dest mask

    readImage src "tile:tile_disks.jpg"

    -- This does the src (overlay) over the dest (background)
    compositeImage dest src overCompositeOp 0 0

    writeImages dest "clip_out.jpg" True