#!/usr/bin/ruby -w # Demonstrate the effects of various composite operators. # Based on ImageMagick's composite test. require 'RMagick' include Magick ROWS = 70 COLS = 70 COLOR_A = "#999966" COLOR_B = "#990066" img = Image.new(COLS, ROWS) triangle = Draw.new triangle.fill(COLOR_A) triangle.stroke('transparent') triangle.polygon(0,0, COLS,0, 0,ROWS, 0,0) triangle.draw(img) image_A = img.transparent('white', TransparentOpacity) image_A['Label'] = 'A' img = Image.new(COLS, ROWS) triangle = Draw.new triangle.fill(COLOR_B) triangle.stroke('transparent') triangle.polygon(0,0, COLS,ROWS, COLS,0, 0,0) triangle.draw(img) image_B = img.transparent('white', TransparentOpacity) image_B['Label'] = 'B' list = ImageList.new null = Image.read("xc:white") { self.size = Geometry.new(COLS,ROWS) } null = null.first.transparent('white', TransparentOpacity) null.border_color = 'transparent' granite = Image.read("granite:") list << null.copy list << image_A list << image_B list << null.copy list << image_B.composite(image_A, CenterGravity, OverCompositeOp) list.cur_image['Label'] = 'A over B' list << image_A.composite(image_B, CenterGravity, OverCompositeOp) list.cur_image['Label'] = 'B over A' list << image_B.composite(image_A, CenterGravity, InCompositeOp) list.cur_image['Label'] = 'A in B' list << image_A.composite(image_B, CenterGravity, InCompositeOp) list.cur_image['Label'] = 'B in A' list << image_B.composite(image_A, CenterGravity, OutCompositeOp) list.cur_image['Label'] = 'A out B' list << image_A.composite(image_B, CenterGravity, OutCompositeOp) list.cur_image['Label'] = 'B out A' list << image_B.composite(image_A, CenterGravity, AtopCompositeOp) list.cur_image['Label'] = 'A atop B' list << image_A.composite(image_B, CenterGravity, AtopCompositeOp) list.cur_image['Label'] = 'B atop A' list << image_B.composite(image_A, CenterGravity, XorCompositeOp) list.cur_image['Label'] = 'A xor B' list << image_B.composite(image_A, CenterGravity, MultiplyCompositeOp) list.cur_image['Label'] = 'A multiply B' list << image_B.composite(image_A, CenterGravity, ScreenCompositeOp) list.cur_image['Label'] = 'A screen B' list << image_B.composite(image_A, CenterGravity, DarkenCompositeOp) list.cur_image['Label'] = 'A darken B' list << image_B.composite(image_A, CenterGravity, LightenCompositeOp) list.cur_image['Label'] = 'A lighten B' list << image_B.composite(image_A, CenterGravity, PlusCompositeOp) list.cur_image['Label'] = 'A plus B' list << image_B.composite(image_A, CenterGravity, MinusCompositeOp) list.cur_image['Label'] = 'A minus B' list << image_B.composite(image_A, CenterGravity, AddCompositeOp) list.cur_image['Label'] = 'A add B' list << image_B.composite(image_A, CenterGravity, SubtractCompositeOp) list.cur_image['Label'] = 'A subtract B' list << image_B.composite(image_A, CenterGravity, DifferenceCompositeOp) list.cur_image['Label'] = 'A difference B' list << image_B.composite(image_A, CenterGravity, HueCompositeOp) list.cur_image['Label'] = 'A hue B' list << image_B.composite(image_A, CenterGravity, SaturateCompositeOp) list.cur_image['Label'] = 'A saturate B' list << image_B.composite(image_A, CenterGravity, LuminizeCompositeOp) list.cur_image['Label'] = 'A luminize B' list << image_B.composite(image_A, CenterGravity, ColorizeCompositeOp) list.cur_image['Label'] = 'A colorize B' list << image_B.composite(image_A, CenterGravity, BumpmapCompositeOp) list.cur_image['Label'] = 'A bumpmap B' list << image_B.composite(image_A, CenterGravity, DissolveCompositeOp) list.cur_image['Label'] = 'A dissolve B' list << image_B.composite(image_A, CenterGravity, ThresholdCompositeOp) list.cur_image['Label'] = 'A threshold B' list << image_B.composite(image_A, CenterGravity, ModulateCompositeOp) list.cur_image['Label'] = 'A modulate B' list << image_A.composite(image_B, CenterGravity, ModulateCompositeOp) list.cur_image['Label'] = 'B modulate A' list << image_B.composite(image_A, CenterGravity, OverlayCompositeOp) list.cur_image['Label'] = 'A overlay B' montage = list.montage { self.geometry = Geometry.new(COLS, ROWS, 3, 3) rows = (list.size+3) / 4 self.tile = Geometry.new(4, rows) self.texture = granite[0] self.fill = 'white' self.stroke = 'transparent' } montage.write('composite.gif') exit