如何防止Android的drawBitmap仅绘制黑色图像?

19

根据原问题,最终结果是在ImageView中呈现具有自然外观的圆角矩形png和投影效果。

我已经实现了阴影效果,但是在绘制时,它会使整个图像变黑。

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





更新:

我实现了Josh的建议,将颜色空间复制到正确的空间,现在它运行得非常好! 对于未来的搜索者,这段代码在图像视图上产生了一个阴影。 您可以调整x和y以及外部常量以获得所需的效果。

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


太棒了!我很高兴所有的努力都得到了回报。 - Josh
我需要做什么来改变阴影的颜色? - Frame91
2个回答

12

我在您上一个问题中进行了评论,但是这里再说一遍。

问题可能出在您将32位图像(原始图像)绘制到8位图像(提取的阴影图像)上。如果是这种情况,请执行以下操作:

Bitmap shadowImage32 = shadowImage.copy(ARGB_8888, true);
在调用extractAlpha函数之后,绘制到该对象上,而不是8位阴影图像上。

3

您需要绘制阴影图像和原始图像。阴影图像仅包含原始图像的alpha值,而不是实际的彩色像素。


这不是发生在c.drawBitmap那一行吗?我以为我正在用shadowImage将originalBitmap绘制到画布上。你能用代码澄清一下吗? - coneybeare
4
他不能这样做。他忙于写一行答案并破坏安卓,真的不太关心开发者的需求。 - StackOverflowed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接