15

目標は、 を に変換しBitmap、データbyte []の のアクティビティ間で渡し、後の段階で に再変換して に表示することです。BundleBitmapImageview

問題は、これを試すたびに、null ビットマップと、説明的で役に立たないログ出力が得られることです。

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

私は次の解決策を見てきました:

ソリューションは、使用される byte[] コードにビットマップを提供します

.compress よりも copyPixelsToBuffer() が不可欠であることを強調

(特に、この場合は必要ないので見てください)。

次のテストケースを実行しました。これにより、問題がコードの変換と復元に確実に絞り込まれます。私のデバッグに基づいて、正しいデコードがあり、バイト配列は正しいサイズでいっぱいで、ビットマップ構成は強制的に同じになり、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は​​何も表示しません (null ビットマップで予想されるように)

4

3 に答える 3

51

ビットマップをインテントに渡し、バンドルから次のアクティビティでビットマップを取得していますが、その時点でビットマップ/画像のサイズが大きい場合、次のアクティビティで画像が読み込まれないという問題があります。

この問題を解決するには、以下の 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) 最初に画像を SDCard に保存し、次のアクティビティでこの画像を ImageView に設定します。

于 2012-12-07T07:20:07.190 に答える
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();
}
于 2012-12-07T07:16:39.697 に答える