我正在使用标准的ActionScript模糊滤镜来模糊图像。该图像稍后将用作圆柱体上的纹理贴图,即它的左右边缘将在3D中相交。这看起来很糟糕,因为模糊过滤器在图像边缘具有不连续性。我想设置它,这样它就会环绕图像,而不是截断滤波器内核,它将执行模运算来从另一端获得像素。这有可能吗?
如果没有--用ActionScript自己编写这样的函数最好的方法是什么?我可以想象,对于较大的图像,使用getPixel32和setPixel32会慢得令人望而却步?
发布于 2009-12-30 21:14:31
选项一:创建一个经过模糊半径扩展的图像。所以你做一些类似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),现在你只需要用new BlurFilter(radius, radius)调用buffer.applyFilter,用new Rectangle(radius, radius, src.width, src.height)调用copyPixels,就完成了。
选项二:如果模糊半径不变,则使用Adobe PixelBender。你可以自己写模数,这应该不会太难。
选择三:实现你自己的高斯内核--这永远不会比选择一快,但比选择二快,因为你总是可以缓冲n-1列矩阵的模糊,并且只计算n+1th列。但是,您可以使用BitmapData.getVector来获取像素缓冲区一次,而不是重复调用getPixel32。
https://stackoverflow.com/questions/1979858
复制相似问题