【问题标题】:Android: Draw multiple bitmaps on another bitmapAndroid:在另一个位图上绘制多个位图
【发布时间】:2011-02-11 10:02:25
【问题描述】:

我正在尝试从多个较小的位图合成背景位图。我正在使用带有 Android SDK 的 Eclipse。

我已经加载了一个(大部分)空白背景位图(像素尺寸为 320x480),如下所示:

Bitmap mBackground = BitmapFactory.decodeResource( res, R.drawable.background );

然后我以同样的方式加载位图“平铺”(128x128)。

我尝试了多种将图块绘制到位图上的方法,但每种方法都无法按照我想要/预期的方式工作。我想在背景位图上的特定位置(像素偏移)绘制缩小到 64x64 的平铺位图。

1) 使用画布...

Canvas c = new Canvas( mBackground );
c.drawBitmap( mTile, null, new Rect( 10, 10, 73, 73 ), null );

这会将图块绘制得太大(不是全尺寸,不是 64x64,但介于两者之间,大约是原始尺寸的 66%)

2)使用drawables(基本上看起来是一样的):

Canvas c = new Canvas( mBackground );
c.translate( 10, 10 );
d.setBounds( 0, 0, 63, 63 );
d.draw( c );

与实验 #1 相同的结果...

文档在许多地方(没有任何地方的简明解释)提到这与设备无关的“密度”有关,因此我尝试了下一种方法......

3) 使用固定规模的资源。我创建了 /res/drawable-nodpi(我也尝试了 /res/drawable)文件夹并将我的资源(背景和平铺 png 图像)移动到其中。从背景位图创建画布时会导致异常,因为未缩放的位图显然变得不可变,因此无法分配给画布!

4) 我尝试使用 BitmapFactory.Options 并将 inScaled 设置为 false,并将这些选项传递给背景和磁贴的 decodeResource 调用。这与 #3 的效果完全相同(抛出异常)。

没有任何效果,它变得非常令人沮丧。我敢肯定,当涉及到不同的坐标空间时,我只是遗漏了位图特有的一些细节,但我在文档或其他地方都找不到它(我尝试了多个 android 开发站点都无济于事)。

希望这样做的人会看到这个请求! 谢谢,杰森

【问题讨论】:

  • 为什么不使用 Bitmap.createScaledBitmap() 将“平铺”从 128x128 缩放到 64x64?
  • 基本上,在尝试了几次实验之后,似乎无法使用合成。如果我单独加载所有图块并动态组合位图(即一次将所有内容绘制到空白画布上),它工作得很好,因为坐标空间都匹配。

标签: android bitmap


【解决方案1】:

Canvas.drawBitmap() 不执行缩放 afaik。

由于您的平铺图像最初是 128x128 并且您想以 64x64 绘制它,最简单的技巧是调用 decodeResource() 并选择减小它的大小:

BitmapFactory.Options options = new BitmapFactory.Options()
options.inSampleSize = 2; // downscale by 50%
Bitmap mTile = BitmapFactory.decodeResource( res, R.drawable.tile, options );

要进行更强大的缩放(例如以任意大小绘制图像),您应该将其包装在 BitmapDrawable 中。

【讨论】:

  • 我并不总是想将 128 缩小到 64。我应该选择一个更好的例子,或者至少更通用 :)
  • 在这种情况下 BitmapDrawable 是你的朋友,根据答案的最后一行。
  • 您答案中的链接已损坏,您忘记了 .html 中的“l”
【解决方案2】:

看起来你的位图密度不同...有a similar issue here。您应该检查您加载的每个 Bitmap 的密度,看看它是否是同一个问题。

【讨论】:

  • 根据 getDensity() 调用,它们都是 160。未缩放位图的不变性(请参阅#3 和 #4 的原始问题中的编辑)似乎阻止我能够合成,然后缩放最终图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多