如何计算图像的最大可显示大小

时间:2014-01-27 15:38:49

标签: android

我试图以最大分辨率显示图像。到目前为止,我管理我的应用程序工作,但我做的是暂时的。

    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;

}

我需要计算这个才能让我的应用在不同的屏幕上工作, 提前,谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

您是否使用调试器跟踪代码,看看它是如何执行的?它似乎完全符合代码的目的,如果你需要修改它,你应该弄清楚如何进行适合你的修改。

这部分......

while ((halfHeight / inSampleSize) > maxHeight && (halfWidth / inSampleSize) > maxWidth) {
   inSampleSize *= 2;
}
仅当inSampleSizehalfHeight大于提供的最大值时,

才会增加halfWidth。因此,如果halfHeight = 972且halfWidth = 1296,则在使用示例参数时,两者都小于最大值并返回inSampleSize = 1。循环永远不会执行。

如果你想破坏这个约定,那么将它改为do-while循环更合适?

答案 1 :(得分:0)

您的代码将返回一个样本大小,以便最终图像始终大于要求(同时使其尽可能小)。 如果您希望图像小于要求,但同时尽可能大,请更改:

final int halfHeight = photoHeight;
final int halfWidth = photoWidth;