Тема: Pixelization
Показать сообщение отдельно
Старый 30.11.2006, 17:15
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 3  
Ответить с цитированием
WindWalker

Регистрация: Nov 2006
Сообщений: 223
Могу предложить 2 варианта, совместимых с AS2.0 и ниже.
Насчёт скорости ничего сказать не могу.

1. Используем DispacementMapFilter и специально построенную карту трансформации.

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

2. Начальное изображение сперва уменьшаем, записываем в битмап, затем снова увеличиваем.
Требуется временный битмап для трансформаций, но на порядок меньшего размера.
Хорошо подходит для случая, когда картинка изначально содержится в битмапе.

Примеры.

Подготовительный этап (одинаковый для обоих)
Код:
import flash.display.*;
import flash.geom.*;
import flash.filters.*;

// ПОДГОТОВКА

// создаём битмапы: начальный и конечный
bmp1 = new BitmapData(100,100,false,0);
bmp2 = new BitmapData(100,100,false,0);

// создаём мувики для отображения битмапов
_root.createEmptyMovieClip("mcHolder1",0);
_root.createEmptyMovieClip("mcHolder2",1);
mcHolder1.attachBitmap(bmp1,0);
mcHolder2.attachBitmap(bmp2,0);
mcHolder2._x = 150;

// заполняем начальный битмап зелёным градиентом
for (var x=0; x<100; x++) {
	for (var y=0; y<100; y++) {
		bmp1.setPixel(x,y,(x+y)<<8);
	}
}
Первый алгоритм:
Код:
// заполняем карту трансформации
var bmpMap = new BitmapData(100,100);
for (var x=0; x<100; x++) {
	for (var y=0; y<100; y++) {
		bmpMap.setPixel(x,y,0x8080-(x%10<<8)-(y%10));
	}
}

var filter = new DisplacementMapFilter(bmpMap, new Point(0,0), 2, 4, 256, 256);
bmp2.applyFilter(bmp1,bmp1.rectangle,new Point(0,0),filter);
Второй алгоритм:

Код:
// создаём временный битмап
bmpTemp = new BitmapData(10,10);

// подготовливаем матрицы для преобразования
m1 = new Matrix();
m1.scale(1/10,1/10);
m2 = new Matrix();
m2.scale(10,10);

// уменьшаем
bmpTemp.draw(bmp1,m1);
// увеличиваем
bmp2.draw(bmpTemp,m2);


Последний раз редактировалось WindWalker; 30.11.2006 в 17:31.