Android:如何:创建现有位图的新副本?

ero*_*ros 40 android

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

我在想以下几点:

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

以下是我的技术/设计问题:

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

更新: 额外的,我的目标是最多20个楼层(这意味着20个512x512 png文件...我正在考虑将其调整为256x256,正如其他人建议的那样).

MSq*_*are 161

这个答案帮助了我:

/sf/answers/1194801611/

代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

  • 实际上这是关于如何创建`Bitmap`副本的问题的唯一**正确答案.根据文档,允许`createScaledBitmap`和`createBitmap`返回原始实例.这应该是公认的答案. (25认同)

Adi*_*yev 6

根据情况,您可以使用:

Bitmap src = ...;
Bitmap dst = src.copy(src.getConfig(), src.isMutable);
Run Code Online (Sandbox Code Playgroud)

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


Suj*_*jit -8

  1. 要创建位图的副本,您可以使用:

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

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

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

  • @Sujit 如果缩放比例为 1 并且未进行任何过滤,则 createScaledBitmap 将返回原始位图 obj。请注意这一点。 (6认同)