2014-01-27 2 views
0

Я пытаюсь показать изображение в максимальном разрешении. Пока я работаю над своим приложением, но то, что я делаю, является временным.Как рассчитать максимальный видимый размер изображения

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 так де размер изображения изменяется до 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

Вы уже следили за кодом с отладчиком, чтобы увидеть, как он выполняется? Кажется, что он делает именно то, что предусмотрено кодом, если вам нужно его изменить, вы должны выяснить, как внести изменения, которые будут работать для вас.

Эта часть ....

while ((halfHeight/inSampleSize) > maxHeight && (halfWidth/inSampleSize) > maxWidth) { 
    inSampleSize *= 2; 
} 

увеличивается inSampleSize только тогда, когда halfHeight и halfWidth больше, чем предусмотренные максимумами. Поэтому, если halfHeight = 972 и halfWidth = 1296 при использовании вашего примера, параметры как минимум превышают максимумы, и возвратят inSampleSize = 1. Цикл никогда не выполняется.

Если вы хотите разорвать это соглашение, то, возможно, изменить его на цикл do-while?

+0

Я отлаживать его, первое, что я получил, как MaxHeight 1184 и максимальная ширина = 720. Но я знаю, что это 1944x2592, потому что, когда я пытался показать изображение без выполнения rezise, ​​у меня была ошибка и максимальное разрешение. Итак, как я могу получить разрешение? btw: спасибо за быстрый ответ – xuandl

0

Ваш код вернет размер выборки, чтобы конечное изображение всегда было больше требования (и в то же время делало его как можно меньшим). Если вы хотите, чтобы ваше изображение меньше, чем требование, но в то же время, как большой, насколько это возможно, изменить это:

final int halfHeight = photoHeight; 
final int halfWidth = photoWidth; 
Смежные вопросы