2007年8月13日星期一

Montage 蒙太奇 相片瀏覽系統 2

加了自動播放、置中,做了些微調,這樣就可以作成螢幕保護程式,或是在一些特殊場合做自動播放了!

執行效果:http://montager.photos.googlepages.com/ImageReader.html




import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
//----------------------------------變數
var BIG_IMAGE_WIDTH:Number = 800;
var COLOR_XML_FILE_PATH:String = "images/images.xml";
var paletteMapObj:Object = new Object();
var oraImg_mc:MovieClip = _root.createEmptyMovieClip("oraImg_mc", _root.getNextHighestDepth());
var pixelImg_mc:MovieClip = _root.createEmptyMovieClip("pixelImg_mc", _root.getNextHighestDepth());
//----------------------------------取得WEB216安全色的BitmapData
function get256bd(srcBD:BitmapData):BitmapData {
var safeColorArray:Array = [0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF];
var redArray:Array = new Array(256);
var greenArray:Array = new Array(256);
var blueArray:Array = new Array(256);
for (var i:Number = 0; i<256; i++) {
var c:Number = i;
for (j=0; j<safeColorArray.length; j++) {
if (c<=safeColorArray[j]) {
c = safeColorArray[j];
break;
}
}
redArray[i] = c << 16;
greenArray[i] = c << 8;
blueArray[i] = c;
}
var rect:Rectangle = new Rectangle(0, 0, srcBD.width, srcBD.height);
var pt:Point = new Point(0, 0);
var bd = new BitmapData(srcBD.width, srcBD.height, true, 0x00000000);
bd.paletteMap(srcBD, rect, pt, redArray, greenArray, blueArray);
return bd;
}
//----------------------------------由指定範圍取出一個像素值
function getPixelByRect(sourceBD:BitmapData, rect:Rectangle):Number {
var rectBD:BitmapData = new BitmapData(rect.width, rect.height, true, 0x00000000);
rectBD.copyPixels(sourceBD, rect, new Point(0, 0));
var bd1Pixel:BitmapData = new BitmapData(4, 4, true, 0x00000000);
var matrix:Matrix = new Matrix();
matrix.scale(4/rect.width, 4/rect.height);
bd1Pixel.draw(rectBD, matrix);
var ary:Array = new Array();
for (var i = 0; i<bd1Pixel.width; i++) {
for (var j = 0; j<bd1Pixel.height; j++) {
var color:Number = bd1Pixel.getPixel32(i, j);
var isFind:Boolean = false;
for (var k = 0; k<ary.length; k++) {
if (ary[k].colorNum == color) {
ary[k].count++;
isFind = true;
break;
}
}
if (!isFind) {
ary.push({colorNum:color, count:1});
//trace(ary[ary.length-1].colorNum)
}
}
}
ary.sortOn("count", Array.DESCENDING | Array.NUMERIC);
return ary[0].colorNum;
}
//----------------------------------載入顏色資料庫
function loadImageXML() {
var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(success:Boolean) {
if (success) {
var photos:Array = this.firstChild.childNodes;
for (var i = 0; i<photos.length; i++) {
var file:String = photos[i].attributes["file"];
var thumbnail:String = photos[i].attributes["thumbnail"];
var color:String = photos[i].attributes["color"];
if (paletteMapObj["{"+color+"}"] == undefined) {
paletteMapObj["{"+color+"}"] = [{file:file, thumbnail:thumbnail}];
} else {
paletteMapObj["{"+color+"}"].push({file:file, thumbnail:thumbnail});
}
}
loadOraImg(photos[Math.floor(Math.random()*photos.length)].attributes["file"], new Rectangle(0, 0, 0, 0));
}
};
xml.load(COLOR_XML_FILE_PATH);
}
loadImageXML();
//----------------------------------載入大圖
function loadOraImg(file:String, rect:Rectangle) {
oraImg_mc.removeMovieClip();
oraImg_mc = null;
oraImg_mc = _root.createEmptyMovieClip("oraImg_mc", _root.getNextHighestDepth());
_mclListener.rect = rect;
_mcl.loadClip(file, oraImg_mc);
}
var _mcl:MovieClipLoader = new MovieClipLoader();
var _mclListener:Object = {};
_mclListener.onLoadInit = function(target_mc:MovieClip) {
//紀錄原始寬高
target_mc.oraWidth = target_mc._width;
target_mc.oraHeight = target_mc._height;
//紀錄縮放寬高
var p:Number;
if (target_mc._width>target_mc._height) {
p = BIG_IMAGE_WIDTH/target_mc._width;
} else {
p = BIG_IMAGE_WIDTH/target_mc._height;
}
//trace(p);
target_mc.targetWidth = target_mc._width*p;
target_mc.targetHeight = target_mc._height*p;
//要移到目標座標
target_mc.targetX = (BIG_IMAGE_WIDTH-target_mc.targetWidth)/2;
target_mc.targetY = (BIG_IMAGE_WIDTH-target_mc.targetHeight)/2;
//切到最上層
target_mc.swapDepths(_root.getNextHighestDepth());
target_mc._x = this.rect.x;
target_mc._y = this.rect.y;
target_mc._width = this.rect.width;
target_mc._height = this.rect.height;
//變大
target_mc.onEnterFrame = function() {
this._x += ((this.targetX-this._x)*0.2);
this._y += ((this.targetY-this._y)*0.2);
this._width += ((this.targetWidth-this._width)*0.2);
this._height += ((this.targetHeight-this._height)*0.2);
if (Math.abs(this.targetX-this._x)<10) {
this._x = this.targetX;
}
if (Math.abs(this.targetY-this._y)<10) {
this._y = this.targetY;
}
if (Math.abs(this.targetWidth-this._width)<10) {
this._width = this.targetWidth;
}
if (Math.abs(this.targetHeight-this._height)<10) {
this._height = this.targetHeight;
}
if (this._x == this.targetX && this._y == this.targetY && this._width == this.targetWidth && this._height == this.targetHeight) {
//顯示WEB216效果
startLoadPixelImgs();
this.onEnterFrame = null;
delete this.onEnterFrame;
}
};
};
_mcl.addListener(_mclListener);
//----------------------------------顯示WEB216效果
function startLoadPixelImgs() {
//把縮圖容器清空,並移到最上面
pixelImg_mc.removeMovieClip();
pixelImg_mc = null;
pixelImg_mc = _root.createEmptyMovieClip("pixelImg_mc", _root.getNextHighestDepth());
pixelImg_mc._x = oraImg_mc._x;
pixelImg_mc._y = oraImg_mc._y;
pixelImg_mc.showPixelAll = function() {
var bd2:BitmapData = new BitmapData(oraImg_mc._width, oraImg_mc._height, true, 0x00000000);
for (var i:Number = 0; i<_mclListener2.cols; i++) {
for (var j:Number = 0; j<_mclListener2.rows; j++) {
var rect:Rectangle = new Rectangle(_mclListener2.cubeWidth*i, _mclListener2.cubeHeight*j, _mclListener2.cubeWidth, _mclListener2.cubeHeight);
//由指定範圍取出一個像素值
var color:Number = getPixelByRect(_mclListener2.bd, rect);
//用這個像素繪製一個區塊
bd2.fillRect(rect, color);
}
}
this.bg2_mc._alpha = 0;
this.bg2_mc.attachBitmap(bd2, 200);
this.bg2_mc.onEnterFrame = function() {
if (this._alpha<100) {
this._alpha += 10;
} else {
this._alpha = 100;
this.onEnterFrame = null;
//馬賽克效果慢慢顯示
_root.onEnterFrame = onEnterFrameLoadPixel;
}
};
};
var bg_mc:MovieClip = pixelImg_mc.createEmptyMovieClip("bg_mc", 2);
var bg2_mc:MovieClip = pixelImg_mc.createEmptyMovieClip("bg2_mc", 3);
var pixelAll_mc:MovieClip = pixelImg_mc.createEmptyMovieClip("pixelAll_mc", 4);
var matrix:Matrix = new Matrix();
var bd:BitmapData = new BitmapData(oraImg_mc._width, oraImg_mc._height, true, 0x00000000);
matrix.scale(oraImg_mc.targetWidth/oraImg_mc.oraWidth, oraImg_mc.targetHeight/oraImg_mc.oraHeight);
bd.draw(oraImg_mc, matrix);
//取得WEB216安全色的BitmapData
bd = get256bd(bd);
_mclListener2.bd = bd;
_mclListener2.cols = 25;
_mclListener2.rows = 25;
_mclListener2.cubeWidth = oraImg_mc._width/_mclListener2.cols;
_mclListener2.cubeHeight = oraImg_mc._height/_mclListener2.rows;
_mclListener2.i = 0;
_mclListener2.j = 0;
//繪製出來
bg_mc._alpha = 0;
bg_mc.attachBitmap(bd, 200);
bg_mc.onEnterFrame = function() {
if (this._alpha<100) {
this._alpha += 10;
} else {
this._alpha = 100;
this.onEnterFrame = null;
//依照WEB216安全色,將畫面轉成馬賽克
this._parent.showPixelAll();
}
};
}
//----------------------------------馬賽克效果慢慢顯示
function onEnterFrameLoadPixel() {
if (false) {
_mclListener2.j++;
if (_mclListener2.j<_mclListener2.rows) {
loadPixelImg();
} else {
_mclListener2.j = 0;
_mclListener2.i++;
if (_mclListener2.i<_mclListener2.cols) {
loadPixelImg();
} else {
_mclListener2.i = 0;
//結束
this.onEnterFrame = null;
}
}
} else {
for (var j = 0; j<_mclListener2.rows; j++) {
_mclListener2.j = j;
loadPixelImg();
}
_mclListener2.i++;
if (_mclListener2.i<_mclListener2.cols) {
} else {
//結束
this.onEnterFrame = null;
}
}
}
//----------------------------------根據馬賽克的每個區塊去載入外部圖檔
function loadPixelImg() {
var rect:Rectangle = new Rectangle(_mclListener2.cubeWidth*_mclListener2.i, _mclListener2.cubeHeight*_mclListener2.j, _mclListener2.cubeWidth, _mclListener2.cubeHeight);
//由指定範圍取出一個像素值
var color:Number = getPixelByRect(_mclListener2.bd, rect);
var mc:MovieClip = pixelImg_mc.pixelAll_mc.createEmptyMovieClip("pixel_"+_mclListener2.i+"_"+_mclListener2.j, _mclListener2.i*10000+_mclListener2.j);
mc._x = _mclListener2.cubeWidth*_mclListener2.i;
mc._y = _mclListener2.cubeHeight*_mclListener2.j;
var img_mc:MovieClip = mc.createEmptyMovieClip("img_mc", 2);
var mask_mc:MovieClip = mc.createEmptyMovieClip("mask_mc", 3);
//是否是最後一個
if (_mclListener2.i == _mclListener2.cols-1 && _mclListener2.j == _mclListener2.rows-1) {
mc.isFinal = true;
}
//作一個色塊遮罩,比較有感覺
mask_mc.lineStyle(1, 0xFFFFFF, 20);
mask_mc.beginFill(color, 70);
mask_mc.lineTo(_mclListener2.cubeWidth, 0);
mask_mc.lineTo(_mclListener2.cubeWidth, _mclListener2.cubeHeight);
mask_mc.lineTo(0, _mclListener2.cubeHeight);
mask_mc.lineTo(0, 0);
mask_mc.endFill();
//亂數決定一個檔案
if (paletteMapObj["{"+color+"}"] != undefined) {
var colorArray:Array = paletteMapObj["{"+color+"}"];
var rndObj:Object = colorArray[Math.floor(Math.random()*colorArray.length)];
var file:String = rndObj.file;
var thumbnail:String = rndObj.thumbnail;
mc.file = file;
_mcl2.loadClip(thumbnail, img_mc);
} else {
//trace("沒有對應的檔案");
//因為不用載入外部圖檔,所以可以直接開始決定下一張
if (mc.isFinal) {
autoFindNext();
}
}
}
var _mcl2:MovieClipLoader = new MovieClipLoader();
var _mclListener2:Object = {};
_mclListener2.onLoadInit = function(target_mc:MovieClip) {
//trace(target_mc._x + ", " + target_mc._y + ", " + target_mc._width + ", " + target_mc._height);
target_mc._width = this.cubeWidth;
target_mc._height = this.cubeHeight;
target_mc.onRelease = pixelMC_onRelease;
//自動決定下一個大圖
if (target_mc._parent.isFinal) {
autoFindNext();
}
};
_mcl2.addListener(_mclListener2);
//----------------------------------每個縮圖被按下時
function pixelMC_onRelease() {
clearInterval(interval);
_root.onEnterFrame = null;
selectPixel(this);
}
function selectPixel(mc:MovieClip) {
//trace("selectPixel, "+mc);
clearInterval(interval);
var pt:Point = new Point(mc._x, mc._y);
mc._parent.localToGlobal(pt);
loadOraImg(mc._parent.file, new Rectangle(pt.x, pt.y, mc._width, mc._height));
}
function autoFindNext() {
var next_mc:MovieClip = null;
while (next_mc == null) {
var rnd_i:Number = Math.floor(Math.random()*_mclListener2.cols);
var rnd_j:Number = Math.floor(Math.random()*_mclListener2.rows);
next_mc = pixelImg_mc.pixelAll_mc["pixel_"+rnd_i+"_"+rnd_j].img_mc;
//trace(next_mc._parent.file);
if (next_mc._parent.file == undefined) {
next_mc = null;
}
}
interval = setInterval(selectPixel, 500, next_mc);
}

0 意見:

關於我






* ben {dot} chang {at} ben {dot} idv {dot} tw
* FriendFeed

贊助我1元美金:

Plurk

標籤雲