Как запретить Android drawBitmap только рисовать черные изображения?

В соответствии с оригинальным вопросом конечный результат - округленный прямоугольник png в ImageView с естественной тенью.

У меня есть теневая работа, но когда она рисует, она делает все изображение черным.

alt text

Как я могу препятствовать тому, чтобы исходное изображение (определенно не черное) было черным при добавлении тени?

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





UPDATE:

Я реализовал предложение Джоша о копировании в правильное цветовое пространство, и теперь он отлично работает! Для будущих поисковиков этот код создает тень при просмотре изображения. Вы можете играть с 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);

alt text

Ответ 1

Я прокомментировал ваш последний вопрос, но здесь он снова.

Проблема может заключаться в том, что вы рисуете 32-битное изображение (оригинал) на 8-битное изображение (извлеченный shadowImage). Если это так, сделайте что-то вроде

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

после вызова extractAlpha и нарисуйте этого парня вместо 8-битного shadowImage.

Ответ 2

Вы должны нарисовать как теневое изображение, так и исходное изображение. Теневое изображение содержит только альфа-значения исходного изображения, а не фактические цветные пиксели.