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.