使用实际像素在图像上绘图

时间:2012-09-02 12:05:51

标签: android image-processing canvas

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

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

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

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

现在,问题是:

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

有没有办法指定w.r.t坐标。原始图像的像素,或在不同设备中获得图像结果相同的方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

  1. 检查设备密度并为此id选择最合适的drawable:from drawable-hdpi / mdpi /.../ default。如果您将图像放到不同的文件夹(hdpi,mdpi等),那将导致每个设备上的大小不同
  2. 如果没有合适的drawable(例如你在/ drawable /文件夹中只提供了一个,但在/ drawable-hpi(etc)/中没有) - 它使用了这个默认的drawable,但是根据它进行缩放关于设备密度和“默认拒绝”。
  3. 您可以在此处查看详细信息: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 /文件夹中资源大小完全相同的位图。

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

答案 1 :(得分:0)

我相信这可能是因为您将Bitmap放入res/drawable文件夹。根据您运行应用程序的设备,分辨率将改变位图,因此不会按照需要绘制线条。

您可以通过将位图放在assets文件夹中并按以下方式加载来解决此问题:

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;

    }

我希望这会有所帮助。