Here the source:
rebol[
title: "Composition By Mask and Color Map"
author: "James Marsden (aka Icarii)"
date: 2003-05-24
purpose: "To demonstrate different techniques for image composition"
]
;this is used to create an opacity mask for overlay
create-mask: func [mask c /local img [image!] v [integer!]][
img: copy mask
for v 1 (img/size/x * img/size/y) 1 [if not (pick mask v) = c [poke img v 0.0.0.255]]
return img
]
;this is used to create an inverted opacity mask for overlay
create-not-mask: func [mask c /local img [image!] v [integer!]][
img: copy mask
for v 1 (img/size/x * img/size/y) 1 [if (pick mask v) = c [poke img v 0.0.0.255]]
return img
]
;this is used to overlay an image onto another
merge-color: func [src dest c /local img [image!] v [integer!]][
img: copy dest
if (length? src) = (length? img)[
for v 1 (img/size/x * img/size/y) 1 [if (pick img v) = c [poke img v pick src v]]
]
return img
]
merge-not-color: func [src dest c /local img [image!] v [integer!]][
img: copy dest
if (length? src) = (length? img)[
for v 1 (img/size/x * img/size/y) 1 [if not (pick img v) = c [poke img v pick src v]]
]
return img
]
;load in test images
msk: load http://www.mustard.co.nz/rebol/vsml-insignia-mask.png
hil: load http://www.mustard.co.nz/rebol/vsml-insignia-hilight.png
norm: load http://www.mustard.co.nz/rebol/vsml-insignia-normal.png
;view some examples of masking and merging etc.
view center-face layout/size [
backcolor pink
origin 0x0
space 0x0
style boxen box 64x64 with [edge: none] effect [key 0.0.0.255]
label 32.32.32 "Mask, Normal and Highlighted Images + An Interactive Image (red bordered image)" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: msk] tab
boxen with [image: norm] tab
boxen with [image: hil] tab
boxen 68x68 edge [size: 2x2 color: red effect: 'bevel] with [image: norm mask: msk lastcolor: none] feel [
detect: func [f e /local v [integer!] c [tuple!]][
if find [move] e/type [
v: (e/offset/x - f/offset/x) + ((e/offset/y - f/offset/y) * f/mask/size/x)
c: pick f/mask v
if not f/lastcolor = c [
f/lastcolor: c
;f/image: create-mask msk c
f/image: merge-color hil merge-not-color norm msk c c
]
show f
]
e
]
]
return
below
label 32.32.32 "Masking by color (with transparency)" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: create-mask msk 255.0.0] tab
boxen with [image: create-mask msk 0.255.0] tab
boxen with [image: create-mask msk 0.0.255] tab
boxen with [image: create-mask msk 255.255.255] return
below
label 32.32.32 "Masking excluding color (with transparency)" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: create-not-mask msk 255.0.0] tab
boxen with [image: create-not-mask msk 0.255.0] tab
boxen with [image: create-not-mask msk 0.0.255] tab
boxen with [image: create-not-mask msk 255.255.255] return
below
label 32.32.32 "Compositing by color" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: merge-color hil msk 255.0.0.0] tab
boxen with [image: merge-color hil msk 0.255.0.0] tab
boxen with [image: merge-color hil msk 0.0.255.0] tab
boxen with [image: merge-color hil msk 255.255.255.0] return
below
label 32.32.32 "Compositing excluding color" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: merge-not-color hil msk 255.0.0.0] tab
boxen with [image: merge-not-color hil msk 0.255.0.0] tab
boxen with [image: merge-not-color hil msk 0.0.255.0] tab
boxen with [image: merge-not-color hil msk 255.255.255.0] return
below
label 32.32.32 "Multi-level Compositing" font [shadow: none name: font-sans-serif style: none]
across
boxen with [image: merge-color norm merge-not-color hil msk 255.0.0.0 255.0.0.0] tab
boxen with [image: merge-color norm merge-not-color hil msk 0.255.0.0 0.255.0.0] tab
boxen with [image: merge-color norm merge-not-color hil msk 0.0.255.0 0.0.255.0] tab
boxen with [image: merge-color norm merge-not-color hil msk 255.255.255.0 255.255.255.0] return
] 384x512
No comments:
Post a Comment