我正在使用标准的ActionScript模糊滤镜来模糊图像。该图像稍后将用作圆柱体上的纹理贴图,即其左右边缘将以3D形式相交。这看起来很糟糕,因为模糊滤镜在图像边缘处具有不连续性。我想设置它以便它将包围图像,这样它不会截断过滤器内核,而是进行模运算以从另一端获取像素。那可能吗?
如果不是 - 在ActionScript中自己编写此类函数的最佳方法是什么?我想使用getPixel32和setPixel32对于较大的图像来说会非常慢?
答案 0 :(得分: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)
,然后使用new Rectangle(radius, radius, src.width, src.height)
调用copyPixels就可以了
选项二:如果模糊半径不变,请使用Adobe PixelBender。你可以自己编写模数,但这不应该很难。
选项三:实现你自己的高斯内核 - 这将永远不会像选项一那么快但比选项二快,因为你总是可以缓冲矩阵的n-1列用于模糊并且只计算第n + 1列。但是,您可以使用BitmapData.getVector来获取一次像素缓冲区,而不是重复调用getPixel32。