尝试使用遮罩裁剪位图时抛出IllegalArgumentException: [英] trying to crop bitmap using mask throws IllegalArgumentException:

查看:747
本文介绍了尝试使用遮罩裁剪位图时抛出IllegalArgumentException:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下代码

public void cropSelection(){
    Bitmap bitmap = annotationBitmap.copy(annotationBitmap.getConfig(), true);
    Canvas canvas = new Canvas(bitmap);
    Paint p = new Paint();
    // p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
    canvas.drawBitmap(imageBitmap, 0, 0, p); // this line throws error
    imageBitmap = bitmap;
}

更令人惊讶的是,当我在onDraw()内使用同一行canvas.drawBitmap(imageBitmap, 0, 0, p)时,它不会引发任何错误.效果很好.

More surprisingly when I am using the same line canvas.drawBitmap(imageBitmap, 0, 0, p) inside onDraw() it does not throw any error. It works well.

Stacktrace

Stacktrace

2020-01-17 11:20:07.815 21388-21388/com.mayank.picturemagic E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mayank.picturemagic, PID: 21388
java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps
    at android.graphics.BaseCanvas.onHwBitmapInSwMode(BaseCanvas.java:550)
    at android.graphics.BaseCanvas.throwIfHwBitmapInSwMode(BaseCanvas.java:557)
    at android.graphics.BaseCanvas.throwIfCannotDraw(BaseCanvas.java:69)
    at android.graphics.BaseCanvas.drawBitmap(BaseCanvas.java:109)
    at android.graphics.Canvas.drawBitmap(Canvas.java:1456)
    at com.mayank.picturemagic.MainView.cropSelection(MainView.java:434)
    at com.mayank.picturemagic.k$6.onClick(k.java:330)
    at android.view.View.performClick(View.java:6608)
    at android.view.View.performClickInternal(View.java:6585)
    at android.view.View.access$3100(View.java:785)
    at android.view.View$PerformClick.run(View.java:25921)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6810)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

推荐答案

最后得到了一个漂亮的解决方案

Finally got a pretty solution

imageBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888, true);

本质上是从位图中删除硬件配置.

Essentially removing the HARDWARE config from the bitmap.

要解决这个问题,我早些时候尝试过imageBitmap = imageBitmap.copy(imageBitmap.getConfig(), true);,在这种情况下,配置为硬件,并且抛出错误,硬件位图始终是不可变的.

To get around this problem, earlier I was trying imageBitmap = imageBitmap.copy(imageBitmap.getConfig(), true); In this case the the config is HARDWARE and it throws error hardware bitmaps are always immutable.

但是,应该有更有效的解决方案以及问题的一部分-why this works inside onDraw() but not outside remains

However there should be more efficient solution and also the part of the question - why this works inside onDraw() but not outside remains

这篇关于尝试使用遮罩裁剪位图时抛出IllegalArgumentException:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆