我正在 as3 中构建一个绘图应用程序,并且在画笔上遇到羽化或模糊边缘的问题。我正在使用 bitmapData.draw() 绘制画笔,但在缓慢绘制时我看到边缘周围颜色较深。
我尝试了许多选项,包括将所有涉及的显示对象设置为 cacheAsBitmap=true、使用 copyPixels 而不是绘制、模糊滤镜与渐变填充……所有这些都无济于事。
下面的课程说明了我的问题。我已经包含了一个可以正常工作但没有羽化边缘的solid() 方法、一个gradient() 方法和一个filter() 方法,它们都显示相同的问题,并且onMove2 使用copyPixels() 并且再次遇到相同的问题。
我能做些什么来解决这个问题吗?!我真的不想为了这么简单的事情使用pixelbender着色器......
package test {
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
public class Sucks extends Sprite {
private var brush:Sprite;
private var brushMap:BitmapData;
private var bmd:BitmapData;
private var radius:Number = 50;
private var color:uint = 0x990000;
public function Sucks() {
brush = new Sprite();
brushMap = new BitmapData(radius*2, radius*2, true, 0x00ffffff);
bmd = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x0);
var bmp:Bitmap = new Bitmap(bmd, PixelSnapping.ALWAYS, true);
addChild(bmp);
//solid();
gradient();
//filter();
brushMap.draw(brush, new Matrix(1, 0, 0, 1, radius, radius));
stage.addEventListener(Event.ENTER_FRAME, onMove);
}
private function solid():void {
brush.graphics.beginFill(color, 1);
brush.graphics.drawCircle(0, 0, radius);
brush.graphics.endFill();
}
private function gradient():void {
var m:Matrix = new Matrix();
m.createGradientBox(radius*2, radius*2, 0, -radius, -radius);
brush.graphics.beginGradientFill(GradientType.RADIAL, [color, color], [1, 0], [0, 250], m);
brush.graphics.drawCircle(0, 0, radius);
brush.graphics.endFill();
}
private function filter():void {
solid();
brush.filters = [new BlurFilter(8, 8, 3)];
}
private function onMove(e:Event):void {
var mp:Matrix = new Matrix();
mp.tx = mouseX;
mp.ty = mouseY;
bmd.draw(brush, mp);
//bmd.applyFilter(bmd, new Rectangle(0, 0, stage.stageWidth, stage.stageHeight), new Point(), new BlurFilter(2, 2, 3));
}
private function onMove2(e:Event):void {
bmd.copyPixels(brushMap, new Rectangle(0, 0, radius*2, radius*2), new Point(mouseX-radius, mouseY-radius), null, null, true);
}
}
}