求助:如何使用Bitmap获取ImageView中的图片(无需指定图片名)
获取ImageView当前显示的Bitmap
我明白你现在的需求——不需要硬编码图片ID,直接获取ImageView当前展示的图片来做后续处理对吧?这里有两种常用的方法可以解决这个问题:
方法一:直接从Drawable提取Bitmap(高效但有局限性)
如果你的ImageView是通过 setImageBitmap() 设置的图片,或者当前显示的Drawable是BitmapDrawable类型(比如从资源加载的普通图片),可以直接提取:
ImageView imageView = findViewById(R.id.imageView); Drawable currentDrawable = imageView.getDrawable(); if (currentDrawable instanceof BitmapDrawable) { Bitmap targetBitmap = ((BitmapDrawable) currentDrawable).getBitmap(); // 拿到Bitmap后就可以进行后续处理了 } else { // 若Drawable不是BitmapDrawable(比如VectorDrawable、SVG等),则需要用下面的通用方法 }
方法二:通用绘制法(适用于所有情况)
不管ImageView是通过setImageResource()、setImageURI()还是其他方式设置的图片,都可以让它把内容绘制到一个空白Bitmap上,从而获取当前显示的画面:
ImageView imageView = findViewById(R.id.imageView); // 注意:要确保ImageView已经完成布局,否则getWidth()/getHeight()会返回0 // 如果需要在布局完成前获取,可以用ViewTreeObserver监听布局完成事件 Bitmap targetBitmap = Bitmap.createBitmap( imageView.getWidth(), imageView.getHeight(), Bitmap.Config.ARGB_8888 ); Canvas canvas = new Canvas(targetBitmap); imageView.draw(canvas); // 现在targetBitmap就是ImageView当前显示的内容了
布局未完成时的处理技巧
如果要在Activity/Fragment刚启动时就获取Bitmap,需要监听ImageView的布局完成事件:
imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 在这里执行方法二的代码获取Bitmap imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this); // 移除监听避免重复触发 } });
内容的提问来源于stack exchange,提问作者Wen
相关产品推荐
相关产品推荐

