以文本方式查看主题 - ╋艺 镇╋ (http://zyzsky.com/bbs/index.asp) -- ┣◇FLASH交流 (http://zyzsky.com/bbs/list.asp?boardid=5) ---- FLASH AS实现马赛克效果 (http://zyzsky.com/bbs/dispbbs.asp?boardid=5&id=138) |
-- 作者:乐魔舞 -- 发布时间:2007/12/28 -- FLASH AS实现马赛克效果 face15|FLASH AS实现马赛克效果|乐魔舞||[全屏欣赏] http://www2.flash8.net/UploadTeach/2006/04/14/200641495157717.rar 一般实现马赛克有 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编译执行. |2007-6-25 17:36:23 |