当前位置: 首页 > 面试题库 >

Android:位图到字节数组并返回:SkImageDecoder :: Factory返回null

曾山
2023-03-14
问题内容

目标是将a转换Bitmap为a byte [],将其在Bundle数据的a个活动之间传递,然后Bitmap在以后的阶段将其重新转换回a
以便显示在中Imageview

问题是,每当我尝试这样做时,我只会得到一个空位图和无描述性,无用的日志输出:

12-07 17:01:33.282: D/skia(2971): --- SkImageDecoder::Factory returned null

(特别是因为在这种情况下没有必要)。

我已经运行了以下测试案例,该案例肯定将问题缩小为转换和还原代码。根据我的调试,解码正确,字节数组的大小正确且已满,位图配置被强制设置为相同,decodeByteArray只是失败了:

package com.example.debug;

import java.nio.ByteBuffer;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
    RelativeLayout rl = null;
    RelativeLayout.LayoutParams rlp = null;

    ImageView ivBef = null;
    ImageView ivAft = null;

    Bitmap bmBef = null;
    Bitmap bmAft = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TEST
        BitmapFactory.Options bmo = new BitmapFactory.Options();
        bmo.inPreferredConfig = Config.ARGB_8888;

        bmBef = BitmapFactory.decodeFile("/mnt/sdcard/Debug/001.png", bmo);
        byte[] b = bitmapToByteArray(bmBef);
        bmAft = BitmapFactory.decodeByteArray(b, 0, b.length, bmo);

        LinearLayout ll = new LinearLayout(this);

        ivBef = new ImageView(this);
        ivBef.setImageBitmap(bmBef);

        ivAft = new ImageView(this);
        ivAft.setImageBitmap(bmAft);

        ll.addView(ivBef);
        ll.addView(ivAft);

        setContentView(ll);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public static byte[] bitmapToByteArray(Bitmap bm) {
        // Create the buffer with the correct size
        int iBytes = bm.getWidth() * bm.getHeight() * 4;
        ByteBuffer buffer = ByteBuffer.allocate(iBytes);

        // Log.e("DBG", buffer.remaining()+""); -- Returns a correct number based on dimensions
        // Copy to buffer and then into byte array
        bm.copyPixelsToBuffer(buffer);
        // Log.e("DBG", buffer.remaining()+""); -- Returns 0
        return buffer.array();
    }

}

Imageview正确显示图像,后不ImageView显示任何图像(如您所期望的使用空位图


问题答案:

您正在将位图传递到Intent中,并从捆绑包中的下一个活动中获取位图,但是问题在于,如果那时您的位图/图像大小很大,则无法在下一个活动中加载图像。

使用以下2个解决方案来解决此问题。

1)首先将图像转换为字节数组,然后传递到Intent,然后在下一个活动中从Bundle中获取字节数组,然后转换为Image(Bitmap)并设置为ImageView。

将位图转换为字节数组:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

将字节数组传递给意图:

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("picture", byteArray);
startActivity(intent);

从捆绑中获取字节数组并转换为位图图像:-

Bundle extras = getIntent().getExtras();
byte[] byteArray = extras.getByteArray("picture");

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(bmp);

2)首先将图像保存到SDCard中,然后在下一个活动中将此图像设置为ImageView。



 类似资料:
  • 问题内容: 我看到许多人都遇到过类似的问题,但是我还没有尝试确切地找到我想要的东西。 因此,我有一个读取输入图像并将其转换为字节数组的方法: 我现在要做的是将其转换回BufferedImage(我有一个需要此功能的应用程序)。请注意,“ test”是字节数组。 但是,这将返回以下异常: 这是因为BufferedImage img为空。我认为这与以下事实有关:在我从BufferedImage到字节数

  • 问题内容: 我有一个实现了Serializable的TouchPoint类,因为它包含位图,所以我为该类编写了writeObject和readObject: 问题是我得到了 SkImageDecoder :: Factory返回null 那么我该如何解决。我知道可能的解决方案是将writeObject()更改为 但是这种方法要慢10倍以上。 copyPixelsToBuffer〜14ms用于写入图

  • 问题内容: 在下面的: 为什么将-127转换为63?以及如何将其恢复为-127 [编辑:]下面的Java版本(表明它不仅是“ Scala问题”) 问题答案: 您正在调用的构造函数使得二进制到字符串的转换使用解码:变得很明显。您想要的是根本不使用解码。 幸运的是,有一个构造函数:。 现在,您将数据存储在一个字符串中,但是您希望完全照原样返回它。但猜猜怎么了! 没错,还会自动应用一种编码。幸运的是,有

  • 问题内容: 我正在开发应用程序并在运行Android 2.2的设备上对其进行测试。在我的代码中,我使用了一个通过检索的位图,并且可以通过对其进行调用来进行更改。当我在运行Android 1.6的朋友的设备上进行测试时,我接到的电话。在线文档说,当位图是不可变的时,从该方法抛出。该文档没有说明有关返回不可变位图的任何内容,但显然必须如此。 我是否可以进行另一个调用以从应用程序资源可靠地获取可变位图,

  • 问题内容: 我已经为这个问题苦苦挣扎了2天…之前曾发布过,但没有答案是正确的。 我的问题是:我正在尝试将byte []转换为图像。byte []来自JSON,格式如下: “ 4oCwUE5HDQoaCgAAAA1JSERSAAAAfwAAAFAIBgAAADBHwqrDsAAAAAlwSFlzAAAAJwAAACcBKgnigJhPAAAgAElEQVR4xZPCrMK9ecWSZcOZfcOfw

  • 问题内容: 我正在编写一个返回经度和纬度的Android应用,但是location保留Null值。 请看看您是否能了解原因,整天困扰着我。代码如下: 问题答案: 如果自设备启动以来GPS从未获得过位置,则位置对象将为null。您可以做的一件事是尝试获取GPS位置和网络位置,然后检查两个位置是否都很好(或哪个更好)并使用该位置。