2009-12-30 36 views
0

我使用標準的ActionScript模糊濾鏡來模糊圖像。該圖像稍後將被用作圓柱體上的紋理圖,即其左側和右側邊緣將在3D中相遇。這看起來很糟糕,因爲模糊濾鏡在圖像邊緣有不連續處。我想設置它,這樣它將環繞圖像,以便截斷濾鏡內核而不是截取濾鏡內核,它將執行模運算以從另一端獲取像素。這是否可能?Actionscript BlurFilter環繞

如果不是 - 在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.applyFilternew BlurFilter(radius, radius)和調用copyPixels與new Rectangle(radius, radius, src.width, src.height),你就完成了。

選項二:如果您的模糊半徑不變,請使用Adobe PixelBender。你可以自己寫模,這不應該很難。

選項三:實現自己的高斯內核 - 這將永遠不會像選項一樣快,但比選項二更快,因爲您總是可以緩衝模糊矩陣的n-1列並計算第n + 1個科拉姆。但是,您可以使用BitmapData.getVector來獲取像素緩衝區,而不是調用getPixel32 repeateadly。

+0

謝謝Joa,我已經實現了你的選項之一。浪費相當多的CPU複製周圍的巨大圖像的渠道,但工程。來自C++我的ActionScript經驗是有限的,但到目前爲止,我發現我付出了很多「漏洞抽象」。即這些庫在他們去的時候都很好,但是一旦你需要實現一些低級別的東西,支持看起來非常麻煩和緩慢。 – BuschnicK

+0

另一種選擇是始終使用較大的BitmapData,這樣您就不會浪費任何資源並根據需要更改UV貼圖。你基本上必須按半徑偏移所有uv座標。 –