我正在使用AS3构建一个绘图应用程序,但是在画笔的边缘上出现了羽化或模糊的问题。我使用bitmapData.draw()来绘制画笔,但是当慢慢绘制时,我看到边缘周围有较暗的颜色区域。
我尝试了许多选项,包括将所有涉及的显示对象设置为cacheAsBitmap=true,使用copyPixels代替draw,模糊滤镜与渐变填充等等...但都没有成功解决问题。
下面的类说明了我的问题。我已经包括了一个solid()方法,它可以正确地工作,但没有羽化的边缘,还有一个gradient()方法和一个filter()方法,它们都显示了相同的问题,而onMove2使用copyPixels()也有同样的问题。
有什么办法可以解决这个问题吗?我真的不想为这么简单的东西使用Pixelbender着色器...
我尝试了许多选项,包括将所有涉及的显示对象设置为cacheAsBitmap=true,使用copyPixels代替draw,模糊滤镜与渐变填充等等...但都没有成功解决问题。
下面的类说明了我的问题。我已经包括了一个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);
}
}
}