Alpha blending i REBOL
09/juni/2007 15:35
Antag att vi har en klipptextur som vi vill
kombinera med en grästextur. Det lättaste
sättet att göra det är kanske att använda
Photoshop, men det är sannerligen inte det
billigaste. Vi kanske dessutom vill kunna
automatisera processen och köra den som ett
led i bygget av vårt spelprojekt.
En lösning är att skriva ett litet script i REBOL som kombinerar bilderna baserat på en "blend mask". En blend mask är en gråskalebild som bestämmer till vilken grad en pixel ska influeras av motsvarande pixel i bilderna som ska kombineras. Svart betyder att enbart pixeln från bild 1 kommer ha någon inverkan på resultatet. Vitt betyder att enbart pixeln från bild 2 kommer ha någon inverkan på resultatet. Alla gråskalor däremellan interpolerar pixlarna från båda bilderna.
REBOL-koden för att utföra blend-operationen ser ut enligt följande:
Nedan syns resultatet. Med den blend mask som användes här är det kanske inte så snyggt, men det är själva principen som jag försöker illustrera.
En lösning är att skriva ett litet script i REBOL som kombinerar bilderna baserat på en "blend mask". En blend mask är en gråskalebild som bestämmer till vilken grad en pixel ska influeras av motsvarande pixel i bilderna som ska kombineras. Svart betyder att enbart pixeln från bild 1 kommer ha någon inverkan på resultatet. Vitt betyder att enbart pixeln från bild 2 kommer ha någon inverkan på resultatet. Alla gråskalor däremellan interpolerar pixlarna från båda bilderna.
REBOL-koden för att utföra blend-operationen ser ut enligt följande:
REBOL [
Title: "Blend"
]
blend: func [source-1 source-2 mask /local p m] [
p: source-2
m: mask
while [
all [not tail? p not tail? m]
][
p/1: to-tuple reduce [p/1/1 p/1/2 p/1/3 255 - m/1/1]
p: next p
m: next m
]
to-image layout [
origin 0x0
at 0x0 image source-1
at 0x0 image source-2
]
]
rock: load-image %rock.png
grass: load-image %grass.png
mask: load-image %mask.png
save/png %grassy-rock.png blend rock grass mask
Title: "Blend"
]
blend: func [source-1 source-2 mask /local p m] [
p: source-2
m: mask
while [
all [not tail? p not tail? m]
][
p/1: to-tuple reduce [p/1/1 p/1/2 p/1/3 255 - m/1/1]
p: next p
m: next m
]
to-image layout [
origin 0x0
at 0x0 image source-1
at 0x0 image source-2
]
]
rock: load-image %rock.png
grass: load-image %grass.png
mask: load-image %mask.png
save/png %grassy-rock.png blend rock grass mask
Nedan syns resultatet. Med den blend mask som användes här är det kanske inte så snyggt, men det är själva principen som jag försöker illustrera.