一般实现马赛克有 2 种办法, 采用的都是遍历图像上的像素, 对相隔一定范围内的像素填充同一颜色, 只不过采样的颜色位置不同, 有选中心点的, 也有选范围内全部像素平均值的, 考虑到 flash 的效率问题, 这个是选择中心点的, 可以省掉大量循环
2 i' V3 t8 u! Z& l1 P7 K 同时注意 stride 要 4 的倍数, 不然的话.. 自己看吧. 哈哈(月光注:其实用2的倍数也就可以了)
- G7 y R0 H0 N: A" E8 G# Himport 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; } ! `6 s" ^, n0 f" O0 W, h3 \% |
以上代码请用FLASH8编译执行.
% S \& l1 L6 ^: A8 h 8 ]; Y8 x* d! q, X7 |8 ^4 e2 L5 j
源文件下载参考: 9 \: m% D. @5 K5 f
|