android - 使用实际像素在图像上绘制

标签 android image-processing canvas

我的目标是在资源图像之上绘制。

因此,我从我的资源中加载图像:

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 创建位图时,它会根据设备密度缩放图像。 其机制大致如下:

  1. 检查设备密度并为此 id 选择最合适的 drawable:来自 drawable-hdpi/mdpi/.../default。如果您将图像放在不同的文件夹(hdpi、mdpi 等),这将导致在每台设备上您将拥有不同的尺寸
  2. 如果没有非常合适的可绘制对象(例如,您只在/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/

相关文章:

javascript - XULRunner 应用程序中的 3d 小部件

android - RecyclerView.OnItemClickListener 与在 RecyclerView 的查看器中实现 onClickListener?

java - 标签 fragment 发现意外的命名空间前缀 "wallet"

opencv - 如何在OpenCV中垂直旋转IplImage?

python - 使用 OpenCV 提高检测线的准确性

ios - 如何提高堆叠式 GPUImage 过滤器的性能

html - 调整 HTML5 Canvas 大小时闪烁

javascript - Canvas 上旋转弧线的丑陋效果

android - postDelayed 后 View 不能为 null

java - 在 Kotlin/Android 中的 WebView 中搜索字符串