android - 使用 createBitmap 和 drawBitmap 崩溃
问题描述
我在带有过滤器的应用程序中的代码存在一些问题。正如我在以下代码中所示,将 createBitmap 与 drawBitmap 一起使用时会发生崩溃:
public static Bitmap doFilter (Bitmap src) {
int width, height;
height = src.getHeight();
width = src.getWidth();
float[] transfMatrix = {
1.5f, 0, 0, 0, 0,
0, 1.5f, 0, 0, 0,
0, 0, 1.5f, 0, 0,
0, 0, 0, 1, 0};
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0f);
cm.set(transfMatrix);
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
Paint paint = new Paint();
paint.setColorFilter(cf);
Bitmap bmOut = Bitmap.createBitmap(src);
Canvas c = new Canvas(bmOut);
c.drawBitmap(bmOut, 0, 0, paint);
return bmOut;
我尝试过如下编码,但如果可能的话,我不想裁剪图像......
public static Bitmap doFilter (Bitmap src) {
int width, height;
height = src.getHeight();
width = src.getWidth();
float[] transfMatrix = {
1.5f, 0, 0, 0, 0,
0, 1.5f, 0, 0, 0,
0, 0, 1.5f, 0, 0,
0, 0, 0, 1, 0};
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0f);
cm.set(transfMatrix);
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
Paint paint = new Paint();
paint.setColorFilter(cf);
Bitmap bmOut = Bitmap.createBitmap(src, 0, (int)(height * 0.001), width, (int)(height * 0.999));
Canvas c = new Canvas(bmOut);
c.drawBitmap(bmOut, 0, 0, paint);
return bmOut;
关于 Logcat 这里你可以找到失败的部分,但我对所有这些消息不太了解......
07-21 16:08:05.790 23134-23134/? E/Diag_Lib: Diag_LSM_Init: Failed to open handle to diag driver, error = 2
07-21 16:08:05.790 23134-23134/? E/Sensors: sns_fsa_la.c(386):fsa: fflush failed, 9
07-21 16:08:05.791 23134-23134/? E/Sensors: sns_fsa_la.c(386):fsa: fflush failed, 9
07-21 16:08:05.815 23134-23140/? W/Sensors: sns_smr_la.c(446):smr_la: smr_apps_la_thread_main is starting, fd=11, sns_smr.en_rx_msg_ptr=b6f73a04
07-21 16:08:05.828 23134-23142/? W/Sensors: sns_sam_app.c(6827):sns_sam_reg_algo: Registering algo service 16, err 0
07-21 16:08:05.842 23134-23144/? E/Sensors: sns_debug_main.c(565):Debug Config File missing in EFS!
07-21 16:08:07.306 22240-22473/? E/FA: Missing google_app_id. Firebase Analytics disabled.
07-21 16:08:07.854 22240-22240/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: v1_0_0, PID: 22240
java.lang.RuntimeException: Unable to start activity ComponentInfo{v1_0_0/v1_0_0.Edition}: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
at android.graphics.Canvas.<init>(Canvas.java:142)
at v1_0_0.Edition.doFilter(Edition.java:300)
at v1_0_0.Edition.initViews(Edition.java:235)
at v1_0_0.Edition.onCreate(Edition.java:99)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-21 16:08:07.867 595-2137/? W/ActivityManager: Force finishing activity v1_0_0/.Edition
07-21 16:08:07.871 595-2137/? W/ActivityManager: Force finishing activity v1_0_0/.Preview
07-21 16:08:07.978 1468-1640/? W/awmy: Empty context buffer. Thus might mean that the context is not synced down.
任何想法?先感谢您!
解决方案
这是因为您将不可变位图传递给 Canvas。为了通过画布对位图执行操作,它需要是可变的。像这样初始化你的位图:
Bitmap immutableBitmap = Bitmap.createBitmap(src, 0, height, width, height);
Bitmap mutableBitmap = immutableBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(mutableBitmap );
推荐阅读
- sql - 在插入或删除之前检查是否存在多对多关系
- c - 我正在使用此代码从文本文件中打印,但程序给了我“-1.#IND00”
- typescript - 打字稿:'fs'包的可选导入,浏览器与nodejs
- java - HashMap 中的 HashMap 与 HashMap Java 中的 Map.Entry
- go - Golang _ struct {} 在一个结构中。它的目的是什么?
- vuejs2 - 已安装的 Vue 路由器事件
- android - 根据互联网质量选择视频网址
- c++ - 如何逐个元素比较 2 个数组?
- html - i 标签不显示在按钮标签内
- c++ - 为什么我不能用模板 push_back 一个对象?