|
|
|
Blend Mode Algorithms - Imaging Lingo
Added on 8/23/2005
|
These blend modes function in the same way as Photoshop's Blend Modes ie. you can "blend" two images together. Currently, the images must be the same size, but it wouldn't be too hard to adapt it by using the rectangle1. Intersect(rectangle2) function if trying to emulate Photoshop. The modes I have converted over to lingo so far are:
multiply
screen
darken
lighten
difference
negation
exclusion
overlay
hardlight
softlight
-- Blend Mode Algorithms
-- ©2005 by Josh Chunick (josh@chunick.com)
-- This code is free to use in commercial applications
-- or however you want. If you use this code you
-- must keep the comments, including this message,
-- intact. Feel free to add any changes or make
-- improvements.
-- Blend Mode code adapted from Jens Gruschel's code
-- http://www.pegtop.net/delphi/blendmodes/
-- multiplies the RGB components of the pixels individually
-- and returns the resulting pixel colour to be used
--result := (a*b) SHR 8;
on multiplyBlendMode (image1, image2)
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = theColour1.red * theColour2.red / 255.0
theGreen = theColour1.green * theColour2.green / 255.0
theBlue = theColour1.blue * theColour2.blue / 255.0
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
return theImage
end
-- 255 - ((255-a) * (255-b) SHR 8);
on screenBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theDivisor = 255.0
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = 255 - ((255 - theColour1.red) * (255 - theColour2.red) / theDivisor)
theGreen = 255 - ((255 - theColour1.green) * (255 - theColour2.green) / theDivisor)
theBlue = 255 - ((255 - theColour1.blue) * (255 - theColour2.blue) / theDivisor)
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--if a < b then
-- result := a
--else
-- result := b;
on darkenBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = theColour2.red
if theColour1.red < theColour2.red then theRed = theColour1.red
theGreen = theColour2.green
if theColour1.green < theColour2.green then theGreen = theColour1.green
theBlue = theColour2.blue
if theColour1.blue < theColour2.blue then theBlue = theColour1.blue
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--if a > b then
-- result := a
--else
-- result := b;
on lightenBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = theColour2.red
if theColour1.red > theColour2.red then theRed = theColour1.red
theGreen = theColour2.green
if theColour1.green > theColour2.green then theGreen = theColour1.green
theBlue = theColour2.blue
if theColour1.blue > theColour2.blue then theBlue = theColour1.blue
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--result := abs(a-b);
on differenceBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = abs(theColour1.red - theColour2.red)
theGreen = abs(theColour1.green - theColour2.green)
theBlue = abs(theColour1.blue - theColour2.blue)
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
-- the true "opposite" of Difference Blend Mode
--result := 255 - abs(255-a-b);
on negationBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = 255 - abs(255 - theColour1.red - theColour2.red)
theGreen = 255 - abs(255 - theColour1.green - theColour2.green)
theBlue = 255 - abs(255 - theColour1.blue - theColour2.blue)
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
-- result := a + b - (a*b SHR 7);
on exclusionBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theDivisor = 127.0
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theRed = theColour1.red + theColour2.red - ((theColour1.red * theColour2.red) / theDivisor)
theGreen = theColour1.green + theColour2.green - ((theColour1.green * theColour2.green) / theDivisor)
theBlue = theColour1.blue + theColour2.blue - ((theColour1.blue * theColour2.blue) / theDivisor)
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--if a < 128 then
-- result := (a*b) SHR 7
--else
-- result := 255 - ((255-a) * (255-b) SHR 7);
-- ****** this is hard light mode in photoshop ******
on overlayBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theDivisor = 127.0
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
if theColour1.red < 128 then
theRed = theColour1.red * theColour2.red / theDivisor
else
theRed = 255 - ((255 - theColour1.red) * (255 - theColour2.red) / theDivisor)
end if
if theColour1.green < 128 then
theGreen = theColour1.green * theColour2.green / theDivisor
else
theGreen = 255 - ((255 - theColour1.green) * (255 - theColour2.green) / theDivisor)
end if
if theColour1.blue < 128 then
theBlue = theColour1.blue * theColour2.blue / theDivisor
else
theBlue = 255 - ((255 - theColour1.blue) * (255 - theColour2.blue) / theDivisor)
end if
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--if b < 128 then
-- result := (a*b) SHR 7
--else
-- result := 255 - ((255-b) * (255-a) SHR 7);
-- ******* this is overlay mode in photoshop *******
on hardlightBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theDivisor = 127.0
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
if theColour2.red < 128 then
theRed = (theColour1.red * theColour2.red) / theDivisor
else
theRed = 255 - ((255 - theColour2.red) * (255 - theColour1.red) / theDivisor)
end if
if theColour2.green < 128 then
theGreen = (theColour1.green * theColour2.green) / theDivisor
else
theGreen = 255 - ((255 - theColour2.green) * (255 - theColour1.green) / theDivisor)
end if
if theColour2.blue < 128 then
theBlue = (theColour1.blue * theColour2.blue) / theDivisor
else
theBlue = 255 - ((255 - theColour2.blue) * (255 - theColour1.blue) / theDivisor)
end if
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
--c := a * b SHR 8;
--result := c + a * (255 - ((255-a)*(255-b) SHR 8)-c) SHR 8;
-- ******** XFader soft light mode - better than photoshop's version *******
on softlightBlendMode (image1, image2)
theStart = the milliseconds
-- using the source image for the width and height
-- you can add your own code here to determine how
-- you want to handle this.
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theDivisor = 255.0
-- running through each pixel in theImage
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theComp = theColour1.red * theColour2.red / theDivisor
theRed = theComp + theColour1.red * (255 - ((255 - theColour1.red) * (255 - theColour2.red) / theDivisor) - theComp) / theDivisor
theComp = theColour1.green * theColour2.green / theDivisor
theGreen = theComp + theColour1.green * (255 - ((255 - theColour1.green) * (255 - theColour2.green) / theDivisor) - theComp) / theDivisor
theComp = theColour1.blue * theColour2.blue / theDivisor
theBlue = theComp + theColour1.blue * (255 - ((255 - theColour1.blue ) * (255 - theColour2.blue ) / theDivisor) - theComp) / theDivisor
theNewColour = color(theRed, theGreen, theBlue)
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
put the milliseconds - theStart
return theImage
end
|
|