【问题标题】:Android: How to: create a new copy of an existing Bitmap?Android:如何:创建现有位图的新副本?
【发布时间】:2019-04-01 10:55:10
【问题描述】:

我将创建一个简单的楼层地图指南。我有不同的楼层和相应的地图。 FLOORS 是按钮,MAPS 是存储在 sdcard 中的 png 文件。当我点击1F时,会显示相应的1Fmap,其他楼层也是如此。

我正在考虑以下几点:

  1. 显示所选地图的图像视图。
  2. Hashmap ( OR ) 来处理位图。用于根据所选楼层获取位图。然后通过 setImageBitmap(..) 设置为 ImageView
  3. 在点击楼层按钮时下载要在 Hashmap 中分配的位图。然后创建位图,设置为 imageview,然后在单击其他楼层时将其存储为 hashmap。

这是我的技术/设计问题:

  1. 如何创建位图副本?
  2. 是否可以逐步存储到hashmap或每次点击楼层按钮时从sdcard获取?
  3. 如果我将使用 hashmap,是否可以使用 Integer(楼层编号)或 String(楼层名称)作为映射键?

更新: 另外,我的目标是最多 20 层(这意味着 20 个 512x512 png 文件......我也在考虑按照其他人的建议将其调整为 256x256)。

【问题讨论】:

    标签: android


    【解决方案1】:

    这个答案对我有帮助:

    https://stackoverflow.com/a/17068594/1373248

    代码如下:

    Bitmap bmp1 = BitmapFactory.decodeResource(cont.getResources(), R.drawable.image);
    //then create a copy of bitmap bmp1 into bmp2
    Bitmap bmp2 = bmp1.copy(bmp1.getConfig(), true);
    

    【讨论】:

    • 实际上这是关于如何创建Bitmap 副本的问题的唯一正确答案。根据文档,createScaledBitmapcreateBitmap 都允许返回原始实例。这应该是公认的答案。
    【解决方案2】:

    根据情况你可以使用:

    Bitmap src = ...;
    Bitmap dst = src.copy(src.getConfig(), src.isMutable);
    

    下面的代码创建了一个副本。这意味着它从源位图中复制像素并创建全新的位图对象。我指出它的原因是因为在互联网上您可以找到许多使用 Bitmap.createBitmap() 的示例,这不能保证新位图是对象还是对旧位图的引用。并且根据具体情况,您可能会出现问题行为。

    【讨论】:

    • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
    【解决方案3】:
    Bitmap OLDBitmap = getBitmap();
    Bitmap newBmp = Bitmap.createBitmap(OLDBitmap);
    

    【讨论】:

    • 实际上,它并不总是/在所有设备上都有效。来自文档:“新位图可能与源是同一对象,或者可能已制作副本”
    • 从源位图返回一个不可变位图。
    • API 文档说“新的位图可能与源是同一对象,或者可能已经制作了副本”。但是它如何使用与源相同的对象以及如何复制新对象?
    【解决方案4】:
    public static Bitmap cloneBitmap(Bitmap bitmap) {
        return bitmap.copy(bitmap.getConfig(),bitmap.isMutable());
    }
    

    【讨论】:

    • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
    【解决方案5】:

    Kotlin 扩展:

    fun Bitmap.copy(): Bitmap? = copy(config, isMutable)
    

    【讨论】:

      【解决方案6】:

      您将获得位图的副本为 bitmap2

      位图bitmap2= bitmap1.copy(bitmap1.getConfig(), true);

      【讨论】:

        【解决方案7】:
        1. 要创建位图副本,您可以使用:

          Bitmap newBmp = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter);

        2. 您可以逐步从 SD 卡中获取图像。这个实现没问题。

        3. 如果您使用的是 Hashmap,那么您可以使用图像 URL 作为 Hashmap 的键。

        【讨论】:

        • >图片网址作为地图键? -> 如果我没有参考楼层号码,我如何确定楼层地图?这就是为什么,我打算使用楼层号作为地图键。可以问问你的意见吗?
        • 您是从服务器动态检索地板图像还是静态的并且始终在 SDCard 中?如果是静态图片,可以使用图片的楼层号或文件名作为key ...
        • i 将使用后台服务从 uurl 下载,然后将其存储在 sdcard 上的固定位置。换句话说,它已经在 sdcard 上可用。
        • @Sujit 如果缩放为 1 且未进行过滤,createScaledBitmap 将返回原始位图 obj。请注意这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 2015-04-28
        相关资源
        最近更新 更多