2012-09-02 37 views
1

我的目标是绘制资源图像的顶部。使用实际像素在图像上绘制

所以,我从我的资源加载图像:

bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true); 

我知道这是不是因为它可以淡然内存问题的最佳途径,但它不是我现在的关心...... 然后,我创建一个画布,并画它

Canvas canv = new Canvas(bm); 
canv.drawLine(0, 10, 50, 70, paint); 

然后我将位图导出到文件。现在

,存在的问题是:

  • 我用画线坐标不在原始图像
  • 如果我运行在不同的设备上的应用程序,以不同的屏幕,所产生的图像的像素是不同的(线有不同的位置和大小)

有没有一种方法来指定坐标wrt原始图像的像素,还是获取图像的结果在不同设备中的结果相同?

谢谢!

回答

1

您遇到的行为是因为Android密度概念。这意味着,当您从R.drawable.id创建位图时,它会根据设备密度缩放图像。 的机制是几乎如下:

  1. 检查的器件密度并选择此id的最合适的可绘制:从可绘制-HDPI/MDPI /.../默认。这将导致在每个设备上你将有不同的大小,如果你把图像放到不同的文件夹中(hdpi,mdpi等)
  2. 如果没有合适的drawable(例如你只提供了一个在/ drawable /文件夹中,但没有在/ drawable-hpi(etc)/)中 - 它使用此默认可绘制,但根据设备密度和“默认密度”对其进行缩放。

你可以在这里查看详细信息:http://developer.android.com/guide/practices/screens_support.html

但是,如果你只需要在所有设备上相同的位图的分辨率,我可以建议2点的方法:

1)将您的图像不进绘制/文件夹,但只是一个:/ drawable- nodpi。这将防止结垢,并且将拒绝Android的调整它的器件密度

2)你可以试试这个方法:

InputStream is = getResources().openRawResource(imageId); 
originalBitmap = BitmapFactory.decodeStream(is); 

这样,你就可以避开Android的密度缩放系统,并得到位图与/ drawable /文件夹中资源的大小完全相同。

请让我知道是否需要一些更多的细节。祝你好运

+0

完美!谢谢你太多了! – jamp

+0

你会推荐这两种方法吗? – jamp

+0

很高兴帮助:) 其实两者都很好,我想。但是,如果您将使用第二个 - 请确保您将该文件置于默认的“可绘制”文件夹中。因为如果你将它放在'drawables-mdpi'(例如) - 代码可能会在hdpi/xhdpi设备上崩溃,因为android不支持'升级'并且可以说“无资源”。 – AlexN

0

我相信这可能是因为你把位图放入res/drawable文件夹。根据您运行应用程序的设备,分辨率会更改位图,因此该行并未按需要绘制。

您可以通过将位图中的资产文件夹,并加载它如下解决这个问题:

public Bitmap readBitmapFromMemory(String filename) { 
     Bitmap defautBitmap = null; 
     File filePath = this.getFileStreamPath(filename); 
     FileInputStream fi; 
     try { 
      fi = new FileInputStream(filePath); 
      defautBitmap = BitmapFactory.decodeStream(fi); 

     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 

     } 

     return defautBitmap; 

    } 

我希望这有助于。