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);

然后我将位图导出到一个文件。

现在,问题是:

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

有没有一种方法可以指定原始图像的像素坐标,或者有一种方法可以在不同的设备中获得相同的图像结果?

谢谢!

4

2 回答 2

1

您面临的行为是由于 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

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

1) 将您的图像不要放入 drawable/ 文件夹,而是放入一个:/drawable- nodpi。它将阻止它扩展并拒绝 Android 调整它以适应设备密度

2)您可以尝试这种方法:

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

通过这种方式,您可以避免 Android 密度缩放系统,并获得与 /drawable/ 文件夹中资源大小完全相同的位图。

如果需要更多详细信息,请告诉我。祝你好运

于 2012-09-02T12:26:08.330 回答
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;

    }

我希望这有帮助。

于 2012-09-02T12:48:01.093 回答