我正在尝试从多个较小的位图合成背景位图。我正在使用Eclipse和Android SDK。
我已经加载了(大部分)空白背景位图(像素尺寸为320x480),如下所示:
Bitmap mBackground = BitmapFactory.decodeResource( res, R.drawable.background );
然后我以相同的方式加载位图'tile'(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图像)移动到其中。从背景位图创建Canvas时会导致异常,因为未缩放的位图显然变为不可变,因此无法分配给Canvas!
4)我尝试使用BitmapFactory.Options并将inScaled设置为false,并将这些选项传递给后台和tile的decodeResource调用。这与#3完全相同(抛出异常)。
没有任何效果,它变得非常令人沮丧。我确信我只是遗漏了一些位图特有的细节,当涉及到不同的坐标空间但是我无法在文档或其他地方找到它(我尝试过多个android开发网站无济于事)。
希望有人这样做会看到这个请求! 谢谢,杰森
答案 0 :(得分:0)
看起来你的位图的密度不同......有a similar issue here。您应该检查加载的每个位图的密度,看是否是同样的问题。
答案 1 :(得分:0)
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
中。