19

元の質問によると、最終結果は、自然に見えるドロップシャドウを備えた丸みを帯びた長方形pngになります。ImageView

シャドウは機能していますが、描画すると画像全体が黒くなります。

代替テキスト

シャドウを追加するときに、元の画像(明らかに黒ではない)が黒くなるのを防ぐにはどうすればよいですか?

    BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER);
    Paint shadowPaint = new Paint();
    shadowPaint.setMaskFilter(blurFilter);

    int[] offsetXY = new int[2];
    Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t);
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);

    Canvas c = new Canvas(shadowImage);
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null);

    imageView.setImageBitmap(shadowImage);





アップデート:

正しい色空間にコピーするというJoshの提案を実装しましたが、今ではうまく機能しています。将来の検索者のために、このコードは画像ビューにドロップシャドウを生成します。xとy、およびOUTER定数を試して、目的の効果を得ることができます。

BlurMaskFilter blurFilter = new BlurMaskFilter(2, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);

int[] offsetXY = new int[2];
Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pier_t);
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);
Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true);

Canvas c = new Canvas(shadowImage32);
c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null);

imageView.setImageBitmap(shadowImage32);

代替テキスト

4

2 に答える 2

12

私はあなたの最後の質問でコメントしました、しかしここに再びあります。

問題は、32ビット画像(元の画像)を8ビット画像(抽出されたshadowImage)に描画していることである可能性があります。その場合は、次のようなことを行います

Bitmap shadowImage32 = shadowImage.copy(ARGB_8888, true);

extractAlpha呼び出しの後、8ビットshadowImageの代わりにその男に描画します。

于 2010-08-27T14:20:27.273 に答える
3

シャドウイメージと元のイメージの両方を描画する必要があります。シャドウイメージには、実際のカラーピクセルではなく、元のイメージのアルファ値のみが含まれます。

于 2010-08-26T22:53:57.820 に答える