在Android L中从ImageView获取位图

58

我想从ImageView获取Bitmap。我已经使用了下面的代码,但是getDrawable()返回null。如何从ImageView获取整个Bitmap

Bitmap bitmap;
if (mImageViewer.getDrawable() instanceof BitmapDrawable) {
    bitmap = ((BitmapDrawable) mImageViewer.getDrawable()).getBitmap();
} else {
    Drawable d = mImageViewer.getDrawable();
    bitmap = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    d.draw(canvas);
}
storeImage(bitmap,"final.jpeg");

2
你的代码应该能够正常工作,请确保你的图像视图具有可绘制对象,如果你正在使用setBackground设置图像,请改用setBitmap。 - elmorabea
5个回答

38
如果您只需要从ImageView获取Bitmap,则以下代码可能适用于您:-
``` Bitmap bm=((BitmapDrawable)imageView.getDrawable()).getBitmap(); ```
请尝试在所有绘图质量文件夹中拥有图像(drawable-hdpi/drawable-ldpi等)。
可能是您正在使用的模拟器或设备具有不同的密度,并尝试从另一个文件夹中获取图像。
如果您在图像中使用了除.png、.jpg或.gif以外的扩展名,则可能无法识别其他扩展名类型。 请参考http://developer.android.com/guide/topics/resources/drawable-resource.html

1
每次都返回null... - Maveňツ
你在提到的文件夹中有图片吗? - droidev
仅在drawable文件夹中。 - Maveňツ
你能把同一张图片粘贴到所有文件夹中并尝试吗? - droidev
仍然在所有文件夹中粘贴相同的内容。 - Maveňツ
显示剩余3条评论

24

根据这个答案,只需按如下方式操作:

imageView.buildDrawingCache();
Bitmap bmap = imageView.getDrawingCache();

2
这并不总是完美运行,通常会出现Canvas:trying to use recycled bitmap的问题。 - Arsalan Saleem
这个解决方案和这个答案(https://dev59.com/EFXTa4cB1Zd3GeqP6fNZ)对我很有用:imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); imageView.layout(0, 0, imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); - Roy
getDrawingCache()已经过时。 - Majid Sadeghi

12

对于 Kotlin:

只需编写此代码,即可从 ImageView 中获取位图

imageview.invalidate()
val drawable = imageview.drawable
val bitmap = drawable.toBitmap()

1
谢谢,这真的很有帮助。 - King Of The Jungle

6
如果您想从Glide加载的图片中获取位图,则以下内容可能对您有所帮助。
 Drawable dr = ((ImageView) imView).getDrawable();
        Bitmap bmp =  ((GlideBitmapDrawable)dr.getCurrent()).getBitmap();

1
将ImagView拍照并转换为字符串以发送到服务器。
    ImageView   ivImage1 = (ImageView ) findViewById(R.id.img_add1_send );
    getStringImage( ( ( BitmapDrawable ) ivImage1.getDrawable( ) ).getBitmap( ) ),



public String getStringImage(Bitmap bm){
    ByteArrayOutputStream ba=new ByteArrayOutputStream(  );
    bm.compress( Bitmap.CompressFormat.PNG,90,ba );
    byte[] by=ba.toByteArray();
    String encod= Base64.encodeToString( by,Base64.DEFAULT );
    return encod;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接