Mosaic effect
AS3 25 декабря , 2008Понадобился эффект мозаики и решил посмотреть что уже сделано. Получилось нагуглить примерчик, посмотреть можно тут. Но после того как я посмотрел исходник, а потом еще и запустил, я был в шоке.
Производительность у найденного примера очень низкая, так при размере пиксела равного 2 или 3 флеш падал. Пришлось капать самому, подглядев принцип. Вот что получилось:
Проект FlashDevelop Mosaic-Image. Загрузить мои классы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | package ru.pulseneon.effects.image { import flash.geom.Rectangle; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; /** * Пиксельный эффект Мозаика. * При "0" - это оригинал, "1" - тоже оригинал. * @author Aleksey Matveev * @version 0.1 */ public class MosaicImage extends Bitmap { //-------------------------------------------------------------------------- // // Private prop // //-------------------------------------------------------------------------- private var _src:BitmapData; private var _pixelSize:uint; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Конструктор. * @param viewObj - ресурс для которого применяеться эффект * @param pixelSize - размер писксела. * */ public function MosaicImage(viewObj:DisplayObject, pixelSize:uint = 0 ) { super(); _src = new BitmapData(viewObj.width, viewObj.height); _src.draw(viewObj); _pixelSize = pixelSize; render(); } //-------------------------------------------------------------------------- // // Getters and Setters // //-------------------------------------------------------------------------- /** * Размер пикселя.Обновление/рендеринг происходит после установки значения. */ public function get pixelSize():uint { return _pixelSize; } public function set pixelSize(value:uint):void { _pixelSize = value; render(); } //-------------------------------------------------------------------------- // // Public methods // //-------------------------------------------------------------------------- /** * Управление рендрингом. */ public function render():void { //trace("Render"); if (_pixelSize == 0 || _pixelSize == 1) { bitmapData = _src; return; } var colorX:uint; var colorY:uint; var _w:uint = _src.width; var _h:uint = _src.height; //steps var numRow:uint = Math.round(_w / _pixelSize); var numColum:uint = Math.round(_h / _pixelSize); //trace(numHorSteps, numVertSteps); var bmd:BitmapData = new BitmapData(_w, _h, false); for (var i:int = 0; i <= numRow; i++) { for (var j:int = 0; j <= numColum; j++) { if (i == numRow) { colorX = _pixelSize * (numRow - 1); }else { colorX = _pixelSize * i; } if (j == numColum) { colorY = _pixelSize * (numColum - 1); }else { colorY = _pixelSize * j; } //draw bmd.fillRect(new Rectangle(i * _pixelSize, j * _pixelSize, _pixelSize, _pixelSize), _src.getPixel(colorX, colorY)); } } //display bitmapData = bmd; } /** * Чистка мусора. * Вызывается для уничтожения */ public function destroy():void { _src.dispose(); _src = null; bitmapData = null; } } } |
18 июня, 2009 в 12:28
PixelBender должен работать быстрее
2 июля, 2009 в 15:02
должен, для 10-ки. а вот работает ли? Интересен размер изображения
12 августа, 2009 в 15:23
Работает для изображений до 2880 по любой оси. Причем среди примеров, есть фильтр pixelate, который идентичен.
27 января, 2010 в 23:25
http://pulseneon.ru/pulseneon/wp-content/uploads/framework.zip
ссылка на “мои классы” неработает))