Actionscript BlurFilter обернуть вокруг

Я использую стандартный фильтр размытия ActionScript, чтобы размыть изображение. Изображение будет позже использовано в качестве карты текстуры на цилиндре, то есть его левый и правый края будут встречаться в 3D. Это выглядит плохо, потому что фильтр размытия имеет разрывы по краям изображения. Я хотел бы установить его так, чтобы он обтекал изображение так, чтобы вместо усечения ядра фильтра он выполнял операцию по модулю, чтобы получить пиксель с другого конца. Это вообще возможно?

Если нет - как лучше написать такие функции самостоятельно в ActionScript? Я полагаю, использование getPixel32 и setPixel32 будет слишком медленным для больших изображений?

1 ответ

Решение

Вариант первый: создать изображение, расширенное радиусом размытия. Итак, вы делаете что-то вроде buffer = new BitmapData(src.width + 2 * radius, src.height + 2 * radius, src.transparent, 0) затем вы выводите src в буфер с переведенной матрицей по радиусу. подобно m = new Matrix() а потом m.translate(radius, radius) и наконец buffer.draw(src, m) теперь вам просто нужно позвонить buffer.applyFilter с new BlurFilter(radius, radius) и вызвать copyPixels с new Rectangle(radius, radius, src.width, src.height) и вы сделали.

Вариант второй: использовать Adobe PixelBender, если ваш радиус размытия не изменяется. Вы можете написать по модулю себя, и это не должно быть трудно.

Вариант третий: Реализуйте свое собственное ядро ​​Гаусса - это никогда не будет так быстро, как первый вариант, но быстрее, чем второй, поскольку вы всегда можете буферизовать n-1 столбцов матрицы для размытия и просто вычислить n+1-й столбец. Однако вы должны использовать BitmapData.getVector для однократного получения пиксельного буфера вместо повторного вызова getPixel32.

Другие вопросы по тегам