Android 使用实际像素绘制图像
我的目标是在资源图像的顶部绘制 因此,我从我的资源中加载图像:Android 使用实际像素绘制图像,android,image-processing,canvas,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, p
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);
然后我将位图导出到一个文件中
现在,问题是:
- 我用来画线的坐标不是原始图像的像素
- 如果我在不同的设备、不同的屏幕上运行应用程序,生成的图像会不同(该行的位置和大小不同)
谢谢 你所面临的行为是因为Android的密度概念。这意味着当您从R.drawable.id创建位图时,它会根据设备密度缩放图像。 机制大致如下:
InputStream is = getResources().openRawResource(imageId);
originalBitmap = BitmapFactory.decodeStream(is);
通过这种方式,您可以避免Android密度缩放系统,并获得与/drawable/文件夹中资源大小完全相同的位图
如果需要更多的细节,请告诉我。祝你好运你所面临的行为是因为Android的密度概念。这意味着当您从R.drawable.id创建位图时,它会根据设备密度缩放图像。 机制大致如下:
InputStream is = getResources().openRawResource(imageId);
originalBitmap = BitmapFactory.decodeStream(is);
通过这种方式,您可以避免Android密度缩放系统,并获得与/drawable/文件夹中资源大小完全相同的位图
如果需要更多的细节,请告诉我。祝您好运我相信这可能是因为您正在将位图放入
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;
}
我希望这有帮助。我相信这可能是因为您正在将位图放入
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;
}
我希望这有帮助。太完美了!非常感谢你!你能推荐这两种方法中的任何一种吗?很乐意帮忙:)我想,实际上这两种方法都很好。但是如果你要使用第二个,一定要把文件放在默认的“drawable”文件夹中。因为如果您将其置于“drawables mdpi”(例如),代码可能会在hdpi/xhdpi设备上崩溃,因为android不支持“升级”,并且可以说“无资源”。非常完美!非常感谢你!你能推荐这两种方法中的任何一种吗?很乐意帮忙:)我想,实际上这两种方法都很好。但是如果你要使用第二个,一定要把文件放在默认的“drawable”文件夹中。因为如果您将其置于“drawables mdpi”(例如),代码可能会在hdpi/xhdpi设备上崩溃,因为android不支持“升级”,并且可以说“无资源”。