我有一个活动,您可以在其中绘制位图,并使用意图将其发送到下一个活动,并将其放入其中的ImageView中。出于某种原因,它不会产生错误,但也不会将图像设置为预期的样子。 宽度和高度不兼容时会出现问题吗?
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent i = new Intent(getApplicationContext(), PrintActivity.class);
i.putExtra("bitmap", byteArray);
startActivity(i);
我只想提到这种方法在其他活动中也可以使用,因为我多次跨活动发送位图。
正在得到意图的活动:
img = findViewById(R.id.img);
byte[] byteArray = getIntent().getByteArrayExtra("bitmap");
if (byteArray.length > 0) {
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); // In a different thread this seemed to help the OP but it didn't in my case
img.setImageBitmap(bmp);
我也尝试将位图保存到图库中,但是它给出了多个错误,有些错误表明位图是空的。尽管我看不到情况如何,因为它是画布的位图。我用这个来获取它:
public Bitmap getBitmap() {
return mBitmap;
}
mbitmap是用来在画布上书写的一个:
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
我在做什么错了?
答案 0 :(得分:1)
我看到您通过压缩到字节数组,然后再次对其进行解码来移动位图。请注意,BitMaps实现了Parcelable
,这很好,因为您可以使用以下方式将包裹直接放入意图中
Intent intentions = new Intent(this, someActivity.class);
intentions.putExtra("parcelable_photo", mPhoto);
要获取可包裹包裹
Intent received = getIntent();
Bitmap mPhoto = (Bitmap) received.getExtras().getParcelable("parcelable_photo");
与您当前的方法相比,这应该更快并且键入的工作更少。
要在imageview中设置此位图,请执行以下操作:
ImageView mImg = findViewById(R.id.img_id);
img.setImageBitmap(mPhoto);
这里是setImageBitmap()
的{{3}}。
我不知道ImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
,但我希望上述方法能解决问题。
如果问题仍然存在,请随时发表评论