Search content:

 

Personal Menu
Username:
Password:
Save password

Become a member

Forgot Password?

 

Don't miss these
HTML Xtra
TurnPict
TextCruncher
Using ActiveX
Fake-3D Motion
RADStingList (Free Version)
E-mailExec 3 Pro
Amplitude Xtra
Convert Fonts
Writing HTML in Text member
MediaMacros Xtras Mall
 

 

 

Behavior Blend Mode Algorithms - Imaging Lingo

Added on 8/23/2005

 

Compatibilities:
D8 D8_5 D9 Mac Parent PC Shockwave

This item has not yet been rated

Author: Chunick (website)

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

 


Upload Provided by ABCUpload ASP

Contact

MMI
22 West Court Sq
Suite 2C
Newnan, GA 30263
USA

Fax - (206) 339-5833

Send e-mail