我的目标是在资源图像之上绘制。
因此,我从我的资源中加载图像:
bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
我知道这不是最好的方法,因为它会导致内存问题,但现在这不是我关心的问题...... 然后,我创建一个 Canvas 并在上面绘图
Canvas canv = new Canvas(bm);
canv.drawLine(0, 10, 50, 70, paint);
然后我将位图导出到一个文件。
现在,问题是:
- 我用来画线的坐标不是原始图像的像素
- 如果我在不同的设备、不同的屏幕上运行该应用程序,生成的图像是不同的(线条的位置和大小不同)
有没有办法指定 w.r.t. 坐标?原始图像的像素,或在不同设备上获得相同图像结果的方法?
谢谢!
最佳答案
您遇到的行为是因为 Android 密度概念。这意味着当您从 R.drawable.id 创建位图时,它会根据设备密度缩放图像。 其机制大致如下:
- 检查设备密度并为此 id 选择最合适的 drawable:来自 drawable-hdpi/mdpi/.../default。如果您将图像放在不同的文件夹(hdpi、mdpi 等),这将导致在每台设备上您将拥有不同的尺寸
- 如果没有非常合适的可绘制对象(例如,您只在/drawable/文件夹中提供了一个,但在/drawable-hpi(etc)/中没有提供)- 它使用此默认可绘制对象,但会缩放它,基于关于设备密度和“默认密度”。
您可以在此处查看详细信息:http://developer.android.com/guide/practices/screens_support.html
但是,如果您只需要在所有设备上使用相同的位图分辨率,我可以建议两种方法:
1) 不要将您的图片放在 drawable/文件夹中,而只放在一个文件夹中:/drawable-nodpi。它将阻止它缩放并拒绝 Android 为设备密度调整它
2) 你可以试试这个方法:
InputStream is = getResources().openRawResource(imageId);
originalBitmap = BitmapFactory.decodeStream(is);
通过这种方式,您可以避免 Android 密度缩放系统并获得与/drawable/文件夹中的资源大小完全一致的位图。
如果需要更多详细信息,请告诉我。祝你好运
关于android - 使用实际像素在图像上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235816/