Android: растровое изображение в байтовый массив и обратно: SkImageDecoder :: Factory вернул null

Цель состоит в том, чтобы преобразоватьBitmap кbyte []Передайте это между действиями вBundle данных, а затем преобразовать его обратно вBitmap на более позднем этапе для отображения вImageview.

Проблема в том, что всякий раз, когда я пытаюсь это сделать, я просто получаю нулевое растровое изображение и неописательный, бесполезный вывод журнала:

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

Я посмотрел на следующие решения:

Решение предоставляет растровое изображение для используемого байта [] кода

Подчеркнул, что copyPixelsToBuffer () необходим по сравнению с .compress

(Особенно учитывая, что в этом случае нет необходимости).

Я выполнил следующий тестовый пример, который определенно сужает проблему до преобразования и восстановления кода. Исходя из моей отладки, существует правильное декодирование, байтовый массив имеет правильный размер и полный, битовые конфиги вынуждены быть одинаковыми,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 ничего не показывает (как и следовало ожидать с нулевым растровым изображением

Ответы на вопрос(4)

Ваш ответ на вопрос