安卓:位图到字节数组和背部:SkImageDecoder ::厂返回null(Android: Bi

2019-07-04 17:17发布

我们的目标是一个转换Bitmap ,以一个byte []把它传递活动之间的Bundle的数据,然后重新转换回一个Bitmap在用于在显示后一阶段Imageview

问题是,每当我试试这个,我只是得到一个空的位图和非描述性的,无益的日志输出:

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

我已经看过了以下解决方案:

溶液供给位图以字节[]使用的代码

强调,copyPixelsToBuffer()是在.compress至关重要

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

我已经运行了这无疑缩小了问题的转化和恢复以下代码的测试用例。 根据我的调试,有正确解码,字节数组的大小正确和完整的,位图CONFIGS被迫相同, 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显示什么(因为你将与一个空位图期待

Answer 1:

你逝去的位图到意图,并从包下一个活动得到的位图,但问题是,如果你的位图/图像大小是当时的图像不会在接下来的活动负载大。

使用下面2个解决方案来解决这个问题。

1)首先转换成图像字节数组然后通入意向和在下一个活动获得从包字节数组,转换为图像(位图),并设置成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)先保存图像到SD卡,并在接下来的活动设置此图片为ImageView的。



Answer 2:

下面的方法和我的作品完美,试试看..

public byte[] convertBitmapToByteArray(Context context, Bitmap bitmap) {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(bitmap.getWidth() * bitmap.getHeight());
    bitmap.compress(CompressFormat.PNG, 100, buffer);
    return buffer.toByteArray();
}


Answer 3:

试试这个:

  bmBef = BitmapFactory.decodeFile("/mnt/sdcard/Debug/001.png", bmo);
  ByteArrayOutputStream baos= new ByteArrayOutputStream();
  bmBef .compress(Bitmap.CompressFormat.PNG, 100, baos);
  byte[] byteArray = baos.toByteArray();


文章来源: Android: Bitmap to Byte Array and back: SkImageDecoder::Factory returned null