Android:如何将整个 ImageView 转换为位图?

Posted

技术标签:

【中文标题】Android:如何将整个 ImageView 转换为位图?【英文标题】:Android: how to convert whole ImageView to Bitmap? 【发布时间】:2011-06-10 13:05:32 【问题描述】:

我的应用程序正在显示不同比例的图像,并在内部(centerInside)imageView 调整大小。我需要的是从 ImageView 创建位图,包括背景(在这种情况下为黑色)。

例如,我有 320x480 的设备屏幕,全屏 imageView,图像大小调整为 280x480。我怎样才能从中获得 320x480 位图?

在此图像视图之上,我有一些我不想包含在位图中的徽标或按钮,它们就像在顶层一样。我所需要的只是从某些方面带有图像和黑色边框的位图。

【问题讨论】:

【参考方案1】:

在 Kotlin 中;

imageView.drawable?.let 
        val mBitmap = (it as BitmapDrawable).bitmap
    

【讨论】:

【参考方案2】:

buildDrawingCache() 被弃用后,它可以在 Kotlin 中使用

 // convert imageView to bitmap
val bitmap = (imageViewId.getDrawable() as BitmapDrawable).getBitmap()

【讨论】:

这一行让我的模拟器崩溃了。郁闷。【参考方案3】:

这是一个有效的代码

imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache());

【讨论】:

已弃用。【参考方案4】:
try 
        photo.setImageURI(Uri.parse("Location");
        BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable();
        Bitmap bitmap = drawable.getBitmap();
        bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
        photo.setImageBitmap(bitmap);

     catch (Exception e) 

    

【讨论】:

【参考方案5】:

您可以只使用 imageView 的图像缓存。它将在布局(缩放、与背景等)时将整个视图渲染到新位图。

只要确保它已建成。

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

这就是屏幕所见的位图。

【讨论】:

听起来不错,但它只是用 NullPointerException 弹出暴击。是因为镜像还没建好? 好的,和***.com/questions/2339429/…一起解决了我的问题:)谢谢。 文档状态 buildDrawingCache() 之后应调用 destroyDrawingCache(参见此处:developer.android.com/reference/android/view/…) 已弃用。【参考方案6】:

只是在这里大声思考(尽管在 Java 中处理图形方面的专业知识很少)也许这样的事情会起作用?:

ImageView iv = (ImageView)findViewById(R.id.imageview);
Bitmap bitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
iv.draw(canvas);

出于好奇,您想完成什么?可能有比您想象的更好的方法来实现您的目标。

【讨论】:

我需要对整个屏幕进行切片并希望在平铺上只有半个图像时有黑边 + 我想让图像在屏幕上居中。 Canvas 带回了一些糟糕的 J2ME 记忆:D 也许我理解错了...你只是想平铺图像吗?您可以在 XML 中定义一个可绘制的位图,它会自动平铺自身。我不太明白你在问什么。 我想将图像切成正方形(即 50x50),包括黑色背景。图像有不同的颜色/比例。我认为快速的方法是从整个 ImageView 创建位图,而不仅仅是图像内容。【参考方案7】:

你试过了吗:

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();

【讨论】:

它给出了图像的大小,但这不是问题。我需要一些快速的方法来创建位图和黑色边框。在这里我想我必须计算图像的方向和中间以及两个黑色边框才能手动将它们添加到从图像创建的位图中。 绝对是最好的解决方案,如果您想获取 ImageView 的实际内容而不仅仅是可见部分。 注意 imageView.getDrawingCache() 会得到实际的位图表示,当缓存被清除时位图会丢失。 @Cristian m 使用您的代码将 imageview 转换为位图,并在按钮单击时我想在surfaceview 上设置该位图,您能指导我如何执行此操作,当我在surfaceview 上设置位图时它会打开黑屏。如何处理这个

以上是关于Android:如何将整个 ImageView 转换为位图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中水平滚动 ImageView?

Android课程---Android ImageView的scaleType属性与adjustViewBounds属性(转)

Android——ImageView的scaleType属性与adjustViewBounds属性 (转)二

Android——ImageView的scaleType属性与adjustViewBounds属性 (转)一

[转]Android ImageView的scaleType属性与adjustViewBounds属性

如何防止 Android 裁剪我的 ImageView?