在我的应用程序中,我显示文档的图像,然后用户可以用手指对文档进行签名。这样可以正常工作,但问题是在屏幕密度小/屏幕密度较小的设备上,签名图像的大小将是图像视图的大小,它将图像放置在原来的尺寸上,使图像更小,更难以读取。
屏幕尺寸较大的设备没有问题,因为大多数情况下不会调整图像大小。
我通过获取imageview的宽度和高度加载图像并相应地缩放它以防止OOM异常
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inMutable = true;
iv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
iv.getViewTreeObserver().removeOnPreDrawListener(this);
try{
int width = iv.getWidth();
int height = iv.getHeight();
int IMAGE_MAX_SIZE = Math.max(width,height);
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
File i = new File(mDocument.getPath());
FileInputStream fis = new FileInputStream(i);
BitmapFactory.decodeStream(fis, null, o);
fis.close();
int scale = 1;
if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
scale = (int)Math.pow(2, (int) Math.ceil(Math.log(IMAGE_MAX_SIZE /(double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
o2.inMutable = true;
fis = new FileInputStream(i);
Bitmap b = BitmapFactory.decodeStream(fis, null, o2);
fis.close();
iv.setBitmap(b);
}catch(Exception e){
e.printStackTrace();
}
return false;
}
});
然后用手指画画后,我通过
获得带有路径的图像Bitmap b = iv.getImage();
所以我的问题是,如果有办法取一个Path
并将其放在未缩放的图像上而不必将未缩放的内容加载到内存中?
我可以创建一个与原始图像大小相同的画布,然后从画布中将路径作为图像获取,然后在我的服务器上合并2吗?