设置不可变位图图像会出错?

Posted

技术标签:

【中文标题】设置不可变位图图像会出错?【英文标题】:setting an immutable bitmap image gives errors? 【发布时间】:2012-04-07 22:59:35 【问题描述】:

我正在学习图形。相机。我已经用相机拍了一张照片,当我设置时

将拍摄的图片“位图图像”作为画布,App崩溃并且logcat说“位图”

图像是不可变的”。实际上,我不知道这是什么意思?有什么建议吗?

提前致谢。

代码

OnClickListener btn01Listener = new OnClickListener() 

    @Override
    public void onClick(View v) 
        // TODO Auto-generated method stub
        Intent CameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(CameraIntent, CAMERA_PIC_REQUEST);           
    
;

protected void onActivityResult(int requestCode, int resultCode, Intent data)

    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) 
           image = (Bitmap) data.getExtras().get("data");
           ImageView img01 = (ImageView) findViewById(R.id.img01);
           //img01.setImageBitmap(image);

           c = new Camera();
           can = new Canvas();
           can.setBitmap(Bitmap.createBitmap(image));
        

LogCaat:

03-23 20:46:16.188: E/AndroidRuntime(452): FATAL EXCEPTION: main

03-23 20:46:16.188: E/AndroidRuntime(452): java.lang.RuntimeException: 无法恢复活动 com.androidbook.Camera3DDemo/com.androidbook.Camera3DDemo.Camera3DDemoActivity: java.lang.RuntimeException : 将结果 ResultInfowho=null, request=0, result=-1, data=Intent act=inline-data (has extras) 传递到活动 com.androidbook.Camera3DDemo/com.androidbook.Camera3DDemo.Camera3DDemoActivity 失败: java.lang.IllegalStateException 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2832) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.access$1600(ActivityThread.java:117) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.os.Handler.dispatchMessage(Handler.java:99) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.os.Looper.loop(Looper.java:130) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 java.lang.reflect.Method.invoke(Method.java:507) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 03-23 20:46:16.188: E/AndroidRuntime(452): at dalvik.system.NativeStart.main(Native Method) 03-23 20:46:16.188: E/AndroidRuntime(452): 原因: java.lang.RuntimeException: 传递结果失败 ResultInfowho=null, request=0, result=-1, data=Intent act=inline -data(有附加功能) 到活动 com.androidbook.Camera3DDemo/com.androidbook.Camera3DDemo.Camera3DDemoActivity:java.lang.IllegalStateException 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:2107) 03-23 20:46:16.188: E/AndroidRuntime(452): ... 13 更多 03-23 20:46:16.188: E/AndroidRuntime(452): 由: java.lang.IllegalStateException 引起 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.graphics.Canvas.setBitmap(Canvas.java:144) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 com.androidbook.Camera3DDemo.Camera3DDemoActivity.onActivityResult(Camera3DDemoActivity.java:43) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.Activity.dispatchActivityResult(Activity.java:3908) 03-23 20:46:16.188: E/AndroidRuntime(452): 在 android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 03-23 20:46:16.188: E/AndroidRuntime(452): ... 14 更多

【问题讨论】:

【参考方案1】:

实际上这意味着您没有更改位图的权限。因此,您必须为您提供的位图创建一个可变副本,该副本可用于在 Canvas 等上进行绘制。

你可以用这个方法做到这一点:

Bitmap.createBitmap(yourBitmap);

【讨论】:

我更改了 onActivityResult() 方法,但应用仍然崩溃 请检查上面发布的logcat Bitmap.createBitmap(yourBitmap); 返回不可变位图,而 canvas.setbitmap() 需要可变位图。 那你可以选择这个:copy(Bitmap.Config config, boolean isMutable) and set isMutable to true 现在,App可以正常工作了,但是can.setBitmap(image.copy(Config.ALPHA_8, true));并没有在屏幕上设置任何图像。请注意,我使用的是模拟器而不是真实设备【参考方案2】:

您需要创建一个将可变设置为 true 的副本位图:

Bitmap newBMP=image.copy( Bitmap.Congif.ARGB_8888, true );

然后您将加载新的 BMP 到画布。

【讨论】:

以上是关于设置不可变位图图像会出错?的主要内容,如果未能解决你的问题,请参考以下文章

加载图像时出错 - “位图大小超出 VM 预算”

如何将位图图像横向设置为纵向

如何在android中更改位图图像颜色?

从相机/图库加载图像位图时会旋转 [Android 9]

如何将位图图像设置为按钮背景图像

从黑白位图图像中提取路径信息