欢迎光临!
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5138|回复: 0

[FLASH] FLASH 8—— AS实现马赛克效果

[复制链接]
发表于 2008-3-30 20:19:22 | 显示全部楼层 |阅读模式

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

! _" f1 T' o+ A3 \3 E! m% d

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

0 a9 x' y2 R$ k3 i$ F, W

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;
}

$ ^1 M: j6 B" H, D% d

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

. l1 B1 [# |" j$ x/ _, c% f

( L% v" u) c0 S0 y' Q

源文件下载参考

1 y! |. C& b: ^

您需要登录后才可以回帖 登录 | 注册

本版积分规则

客户端