Понадобился эффект мозаики и решил посмотреть что уже сделано. Получилось нагуглить примерчик, посмотреть можно тут.  Но после того как я посмотрел исходник, а потом еще и запустил, я был в шоке.

Производительность у найденного примера очень низкая, так при размере пиксела равного 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;
}
}
}