3

as3で描画アプリケーションを構築していますが、ブラシのエッジがぼかしたりぼやけたりする問題があります。ブラシを描画するためにbitmapData.draw()を使用していますが、ゆっくり描画すると、エッジの周りに暗い色の領域が表示されます。

関係するすべての表示オブジェクトをcacheAsBitmap=trueに設定したり、描画の代わりにcopyPixelsを使用したり、フィルターをぼかしたり、グラデーションを塗りつぶしたりするなど、さまざまなオプションを試しました。

次のクラスは私の問題を示しています。正しく機能するがフェザーエッジのないsolid()メソッド、gradient()メソッド、filter()メソッドを含めましたが、どちらも同じ問題を示しています。また、onMove2はcopyPixels()を使用しており、同じ問題があります。

これを修正するために私にできることはありますか?!こんなに単純なものにピクセルベンダーシェーダーを使いたくありません...

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);
        }

    }

}
4

6 に答える 6

2

あなたの問題は、Flash が事前に乗算されたアルファを使用するという事実によって引き起こされます。通常、これは大きな問題ではありませんが、アルファ値が非常に低いピクセル値を使用している場合、残念ながらぼかしたソフトフェザー ブラシを使用する場合に非常に一般的です。

事前乗算により、ピクセルの情報が失われます。また、アルファ値が低い場合、色の値が効果的に切り捨てられます。これは、アプリでゆっくりと描画していて、同じピクセルが互いに何度も重ねて描画されている場合に発生します。その領域をますます暗くします。

乗算前の問題の詳細については、私の古い投稿を確認してください: http://www.quasimondo.com/archives/000665.php

アルファ チャネルと RGB チャネルを別々に処理する場合を除いて、これについてできることは何もありません。しかし、その後、すべての合成を自分で行う必要があり、これは簡単な作業ではなく、アプリの速度が大幅に低下する可能性があります。

于 2012-06-25T12:45:17.930 に答える
1

BlurFilterうまくいかなかったことに驚いています。私は過去にそれで運が良かった. 設定を微調整する必要があるかどうかを確認するために、 Flex Filter Explorerをいじってみる価値があるかもしれません。

もう 1 つの方法は、透明度が高く、半径が小さくなる複数の同心円を描画して、ぼやけたエッジをシミュレートすることです。

于 2011-03-06T01:43:48.823 に答える
0

それと関係があるかどうかはわかりませんが、透明度をオンに設定していますが、BitmapData は透明ではありません。

brushMap = new BitmapData(radius*2, radius*2, true, 0x00ffffff);

brushMap = new BitmapData(radius*2, radius*2, true, 0);

また、PixelSnapping を変更してみてください。PixelSnapping に対するALWAYS値。NEVERですが、あなたはすでにそれを試したと思います。

于 2011-03-08T16:57:30.823 に答える
0

これは、ロジックよりもエンターフレームの問題だと思います。enter_frame ハンドラーを mouse_move ハンドラーに変更すると、はるかにうまく機能することに気付きました。enter_frame を使用する際の問題は、同じアイテムを何度も描画していることです。これには当然独自のアーティファクトがあります。そのため、600 回ほど描画すると、それらのアーティファクトが表示され始めます。mouse_move を使用する方が良いと思います。

enter_frame を使用する必要がある場合は、enter_frame と mouse_move の両方にリストし、enter_frames の描画の不透明度を大幅に下げることをお勧めします。

これは私にとってうまくいきました:

stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
于 2011-03-07T17:24:46.327 に答える
0

ブラシのcacheAsBitmapプロパティを true に変更します。

brush.cacheAsBitmap = true;

スプライトはベクターではなくビットマップとしてメモリに保持されるため、描画するとピクセルがより正確にマッピングされます。

于 2012-05-31T00:36:21.363 に答える
0

ブラシの色が単色の場合は、グローフィルターでも試すことができます。正確な設定で実現できます

于 2011-03-07T14:10:03.587 に答える