1

マスクを別のビットマップと一緒に使用しています。画像でわかるように、残念ながら、マスキングの結果、わずかに黒い境界線が表示されましたが、操作は正常に実行されます。

ここに画像の説明を入力してください

この境界線を削除するにはどうすればよいですか?ソース画像にはありません。

使用しているコードを投稿します。

public Bitmap mask(Bitmap source) {
    Bitmap targetBitmap = Bitmap.createBitmap(getWidth(),getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(targetBitmap);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    paint.setAntiAlias(true);
    paint.setDither(true);
    canvas.drawBitmap(source, 0, 0, null);
    canvas.drawBitmap(getMask(), 0, 0, paint);
    paint.setXfermode(null);
    return targetBitmap;        
}

ここで、getMask()は、パズルの図を表すビットマップを返します。私はあなたの助けを受け取りたいです、すべてに感謝します

私の英語でごめんなさい:-)

アップデート:

黒い境界線は私がこの写真で指摘しているものです:

ここに画像の説明を入力してください

アップデート:

変換のシーケンスを配置します。3番目の画像は最初の画像と同じですが、色はありません。問題はパズルの黒い縁です。もっと明確にしたいと思います:

ここに画像の説明を入力してください

4

1 に答える 1

0

私がマスクを使って絵を描く方法は、あなたがしていることとは逆です。

public Bitmap mask(Bitmap source) {
    Bitmap targetBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(targetBitmap);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    // paint.setAntiAlias(true); // you've already set this in the constructor
    paint.setDither(true);
    canvas.drawBitmap(getMask(), 0, 0, null);
    canvas.drawBitmap(source, 0, 0, paint);
    // paint.setXfermode(null); // no need for this
    return targetBitmap;        
}

PorterDuff.Mode が SRC_IN (DST_in ではない) に設定され、マスクが最初に描画され、次にそのマスクの上に画像が描画されることに注意してください。このアプローチでは、前のソースをベース マスクとして描画し、新しい (パズル) マスクを追加してから、SRC_IN ペイントを使用してその上に最終的なソース/イメージを描画し、毎回新しいパズルのピースを追加することもできます。それでも黒い境界線が解決しない場合は、これらの問題を引き起こしている可能性のあるぼかした (透明な) エッジがマスクにないことを確認してください。

また、ANTI_ALIAS_FLAG はテクスチャに対して何もしません。滑らかにスケーリングされたテクスチャが必要な場合は、paint.setFilterBitmap(true); を使用します。

于 2013-04-17T09:05:44.373 に答える