FLASH AS实现马赛克效果

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

动画效果:

点击这里下载源文件

一般实现马赛克有 2 种办法, 采用的都是遍历图像上的像素, 对相隔一定范围内的像素填充同一颜色, 只不过采样的颜色位置不同, 有选中心点的, 也有选范围内全部像素平均值的, 考虑到 flash 的效率问题, 这个是选择中心点的, 可以省掉大量循环

同时注意 stride 要 4 的倍数, 不然的话.. 自己看吧. 哈哈(月光注:其实用2的倍数也就可以了)

import flash.display.BitmapData;

// 场景中摆个叫 img 的 mc 就 ok

var oldBmp:BitmapData = new BitmapData(img._width, img._height);

oldBmp.draw(img);

var newBmp:BitmapData = mosaic(oldBmp, 12);

var mc = createEmptyMovieClip("mc", 1);

mc.attachBitmap(newBmp, getNextHightestDepth());

mc._x = img._width;

function mosaic(bmp:BitmapData, stride:Number):BitmapData {

var startTime = getTimer();

var newBmp:BitmapData = new BitmapData(bmp.width, bmp.height);

var w = bmp.width / stride + 1;

var h = bmp.height / stride + 1;

var edgeW = bmp.width % stride; // 边缘不足 stride 的部分

var edgeH = bmp.height % stride;

var centerW = (stride-1)/2; // 第一格的中心点

var centerH = centerY; // 第一格永远是方的

var tmpX, tmpY; // 循环中的真实像素位置, 前面 w, h 被除过了..

var blockW, blockH; // 马赛克的格子

var i = -1;

while (++i < w) {

tmpX = i * stride;

if (i == w - 1){

blockW = edgeW;

} else {

blockW = stride;

}

centerW = (blockW - 1) / 2;

var j = -1;

while (++j < h) {

tmpY = j * stride;

if (i == h - 1){

blockH = edgeH;

} else {

blockH = stride;

}

centerH = (blockH - 1) / 2;

var color = bmp.getPixel(tmpX + centerW, tmpY + centerH);

var m = -1;

while (++m < blockW) {

var n = -1

while (++n < blockH) {

newBmp.setPixel(tmpX + m, tmpY + n,color);

}

}

}

}

trace("Cost : "+(getTimer()-startTime));

return newBmp;

}

以上代码请用FLASH8编译执行.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航