Как сделать так, чтобы Android drawBitmap не рисовал только черные изображения? - PullRequest
19 голосов
/ 27 августа 2010

Согласно исходному вопросу , конечный результат - округленный прямоугольник 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);

ОБНОВЛЕНИЕ:

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

Ответы [ 2 ]

12 голосов
/ 27 августа 2010

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

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

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

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

3 голосов
/ 27 августа 2010

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

...