我在RelativeLayout中有一个imageView,在设计时我从资源加载144x144 png图像,一切看起来都不错:
现在,在代码中,我用相机拍照并将其裁剪为144x144并将其加载到图像视图中:
imageViewMyPicture.setImageBitmap(bitmap);
但现在imageView缩小了:
两张图片都有100%相同的尺寸,144x144,如果我在设计时将第二张图片加载到imageView,则正常加载大小。
我做错了什么?
答案 0 :(得分:1)
确保在加载图片时考虑到您正在运行的设备的密度。你认为你有144x144,但这可能是原始图像文件,但是当放置在高密度的设备上时,它将被渲染到接近200x200。然后,当您将相机图像剪切为144x144时,您将获得原始尺寸,而不是调整后的密度尺寸。确保您获得该功能的简单方法是使用资源读取图像:
例如,使用此签名加载位图意味着应用程序将以正确的密度读取图像,并为其指定该设备所需的大小。
selectImg = BitmapFactory.decodeResource(getResources(), R.drawable.drop_device);
答案 1 :(得分:1)
创建缩放位图时需要考虑密度。由于您的ImageView
在设置新位图之前具有正确的尺寸,因此您可以在缩放新ImageView
时使用Bitmap
的尺寸...例如:
我假设您正在使用Uri
来从文件系统中检索存储的图像。如果您使用的是File
,请使用Uri.fromFile(file)
获取Uri
。我通常使用AsyncTask
来实现这一点,因为你应该对主线程进行位图处理...这里有一些sudo代码(为简单起见,不在AsyncTask
中,但很容易重构):
//Somewhere in your Activity
public void scaleAndSetBitmap(ImageView imageView, Uri uri){
InputStream stream = null;
Bitmap bitmap = null;
try {
stream = getContentResolver().openInputStream(uri);
bitmap = BitmapFactory.decodeStream(stream, null, options);
if (image_view != null && bitmap != null) {
bitmap = Bitmap.createScaledBitmap(bitmap, image_view.getWidth(), image_view.getHeight(), true);
image_view.setImageBitmap(bitmap);
}
} catch(Exception e){
e.printStackTrace();
return;
} finally {
try{
stream.close();
} catch(IOException i){
return;
}
}
}