/*
* This work is licensed under a Creative Commons Attribution 3.0 License.
* http://creativecommons.org/licenses/by/3.0/
*/
/*
* Chromaque
* Chromaque class combines two images
* Pixels with the specifics color will be replaced with pixels of a target image
*
* @author: Han Sanghun (http://hangunsworld.com/blog)
* @last modified: 2007-05-26
* @language version: ActionScript 3.0
*/
package{
import flash.display.*;
import flash.geom.*;
public class Chromaque extends MovieClip{
// image dimmesions
private const WID:uint = 139;
private const HGT:uint = 173;
// original bitmapData
private var ori_bd:BitmapData;
private var ori_bmp:Bitmap;
// target bitmapData
private var image_bd:BitmapData;
// rectangles
private var rect:Rectangle;
private var pnt:Point;
private var area_rect:Rectangle;
private var area_mc:MovieClip;
// chrom bitmapData
private var chrom_bd:BitmapData;
private var chrom_bmp:Bitmap;
// result bitmapData
private var result_bd:BitmapData;
private var result_bmp:Bitmap;
// color to be replaced
var chromColor:uint = 0xFFD9D9D9;
/*
* Chromaque class constructor
*/
public function Chromaque(){
// draw original image
ori_bd = new BitmapData(WID, HGT, true, 0×00000000);
ori_bd.draw(source1_mc);
ori_bmp = new Bitmap(ori_bd);
addChild(ori_bmp);
ori_bmp.y = 180;
// draw target image
image_bd = new BitmapData(WID, HGT, true, 0×00000000);
image_bd.draw(source2_mc);
// create chrom bitmapDate
// you can use chrom as a mask
chrom_bd = new BitmapData(WID, HGT, true, 0×00000000);
// clone original bitmapDate
result_bd = ori_bd.clone();
// get rectangle filled with the color to be replaced
area_rect = ori_bd.getColorBoundsRect(0xFFFFFFFF, chromColor, true);
// show me the area
area_mc = new MovieClip();
area_mc.y = 180;
area_mc.graphics.clear();
area_mc.graphics.beginFill(0xFF0000, .5);
area_mc.graphics.drawRect(area_rect.x, area_rect.y, area_rect.width, area_rect.height);
area_mc.graphics.endFill();
addChild(area_mc);
// area_rect is used in order to minimize the “for” roof
var startX:uint = area_rect.x;
var startY:uint = area_rect.y;
var endX:uint = startX + area_rect.width;
var endY:uint = startY + area_rect.height;
// lock up bitmapData
chrom_bd.lock();
result_bd.lock();
for(var i:uint=startX; i<=endX; i++){
for(var k:uint=startY; k<=endY; k++){
// when the color matchs the chromColor
if(ori_bd.getPixel32(i, k) == chromColor){
// paint chrom with red
chrom_bd.setPixel32(i, k, 0xFFFF0000);
// paint result with target image
result_bd.setPixel32(i, k, image_bd.getPixel32(i, k));
}
}
}
// unlock bitmapData
chrom_bd.unlock();
result_bd.unlock();
// display chrom
chrom_bmp = new Bitmap(chrom_bd);
addChild(chrom_bmp);
chrom_bmp.x = 150;
chrom_bmp.y = 180;
// display result
result_bmp = new Bitmap(result_bd);
addChild(result_bmp);
result_bmp.x = 300;
result_bmp.y = 180;
}// end of Chromaque
}// end of class
}// end of package
답글 남기기