我试图以最大分辨率显示图像。到目前为止,我管理我的应用程序工作,但我做的是暂时的。
private Bitmap loadImage() {
String imgName=resolveImageName();
if(!imgName.equals("")){
String imgN=Environment.getExternalStorageDirectory().getAbsolutePath()+ImageChooserActivity.GENFACE_PATH+imgName;
Log.d("LOAD IMAGE", imgN);
BitmapFactory.Options op = new BitmapFactory.Options();
op.inSampleSize = 2;
Bitmap bm = BitmapFactory.decodeFile(imgN, op);
return bm;
}
return null;
我尝试使用以下代码计算inSamplesize,但我总是得到1,这不是有效值。我用于inSampleSize的图像的最大值是2(图像分辨率2048x2048,最大分辨率支持1944x2592,因此de image调整为1/2 972x1296)
private int calculateInSampleSize(BitmapFactory.Options options){
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int maxHeight = dm.heightPixels;
int maxWidth = dm.widthPixels;
int photoHeight=options.outHeight;
int photoWidth=options.outWidth;
int inSampleSize = 1;
if (photoHeight > maxHeight || photoWidth > maxWidth) {
final int halfHeight = photoHeight / 2;
final int halfWidth = photoWidth / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > maxHeight
&& (halfWidth / inSampleSize) > maxWidth) {
inSampleSize *= 2;
}
}
System.out.println("inSampleSize: "+inSampleSize);
return inSampleSize;
}
我需要计算这个才能让我的应用在不同的屏幕上工作, 提前,谢谢你的帮助
答案 0 :(得分:0)
您是否使用调试器跟踪代码,看看它是如何执行的?它似乎完全符合代码的目的,如果你需要修改它,你应该弄清楚如何进行适合你的修改。
这部分......
while ((halfHeight / inSampleSize) > maxHeight && (halfWidth / inSampleSize) > maxWidth) {
inSampleSize *= 2;
}
仅当inSampleSize
和halfHeight
大于提供的最大值时,才会增加halfWidth
。因此,如果halfHeight
= 972且halfWidth
= 1296,则在使用示例参数时,两者都小于最大值并返回inSampleSize = 1
。循环永远不会执行。
如果你想破坏这个约定,那么将它改为do-while循环更合适?
答案 1 :(得分:0)
您的代码将返回一个样本大小,以便最终图像始终大于要求(同时使其尽可能小)。 如果您希望图像小于要求,但同时尽可能大,请更改:
final int halfHeight = photoHeight;
final int halfWidth = photoWidth;