2012-12-01 4 views
2

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

Я хочу знать, как обращаться с изменением размера изображения, выбранного из галереи телефонов. После выбора, я предполагаю, что потребуется некоторое изменение размера, чтобы поместить его в сетку.

Однако, мне нужно сохранить измененное изображение для каждой плотности экрана; хранить одну версию xhdpi и уменьшать масштаб для других устройств, или быть умным каким-то другим способом?

Причина заключается в том, что приложение хранит это изображение в облаке db, а другие люди могут скачать это изображение. Они могут видеть изображение на разных устройствах (отсюда и требования к разным размерам изображений). Как следует обрабатывать управление этим изображением?

ответ

2

Надеюсь, вы найдете код ниже полезного. Он будет возвращать изображение с параметрами reqd с минимальными накладными расходами. Я использовал это много раз, работает как шарм. Вы можете установить требуемый размер в соответствии с целевым устройством. Масштабирование приведет к размытию изображения, но это не так.

private Bitmap getBitmap(Uri uri) {        
    InputStream in = null; 
    try { 
     final int IMAGE_MAX_SIZE = 200000; // 0.2MP 
     in = my_context.getContentResolver().openInputStream(uri); 

     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true;     //request only the dimesion 
     BitmapFactory.decodeStream(in, null, o); 
     in.close(); 

     int scale = 1; 
     while ((o.outWidth * o.outHeight) * (1/Math.pow(scale, 2)) > IMAGE_MAX_SIZE) { 
      scale++; 
     } 

     Bitmap b = null; 
     in = my_context.getContentResolver().openInputStream(uri); 
     if (scale > 1) { 
      scale--; 
      // scale to max possible inSampleSize that still yields an image 
      // larger than target 
      o = new BitmapFactory.Options(); 
      o.inSampleSize = scale; 
      b = BitmapFactory.decodeStream(in, null, o); 
      // resize to desired dimensions 
      int height = b.getHeight(); 
      int width = b.getWidth(); 

      double y = Math.sqrt(IMAGE_MAX_SIZE 
        /(((double) width)/height)); 
      double x = (y/height) * width; 

      Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, (int) y, true); 
      b.recycle(); 
      b = scaledBitmap; 
      System.gc(); 
     } else { 
      b = BitmapFactory.decodeStream(in); 
     } 
     in.close(); 

     return b; 
    } catch (IOException e) { 

     return null; 
    } 

} 
+0

Спасибо Я буду рассматривать это как вариант изменения размера. – HGPB

1
android:scaleType="fitXY" 
android:layout_gravity="center" 

будет масштабировать изображение и центр его размер в размер контейнера для fill_parent с, и он должен сделать это.

+0

Интересное спасибо. Похоже, я могу сохранить изображение самого большого размера, которое мне нужно, и использовать его для управления тем, как он подходит. – HGPB

0

Вы можете разместить свои изображения на рисунках (без создания xhdpi, hdpi, mdpi, ldpi ...) (глобальных изображений).

Затем вы можете создать 4 одинаковых макета для разных экранов. Все ваши макеты могут использовать изображения в вашем чертежном директоре. Таким образом, вы можете легко изменить размер изображения.

+0

Я не планирую заполнять папки res с предварительно сделанными изображениями. Пользователь выбирает изображение из галереи (например, изображение самого себя). – HGPB

+0

Однако это та же логика. Изображение, выбранное пользователем, может быть изменено в другом макете, который вы создали. Вы можете использовать android: scaleType = "fitXY", чтобы поместить свое изображение на это изображение. – Talha

+0

android: scaleType = "fitXY: Если вы используете стандартный размер изображения, это может быть полезно, но размер изображения будет меньше, чем ваш коэффициент изображения. Вы можете справиться с этой проблемой, обрезав image.android:scaleType="centerCrop" – Talha

4

ли что-то вроде этого:

DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    Bitmap bitmapOrg = new BitmapDrawable(getResources(), new ByteArrayInputStream(imageThumbnail)).getBitmap(); 

    int width = bitmapOrg.getWidth(); 
    int height = bitmapOrg.getHeight(); 

    float scaleWidth = metrics.scaledDensity; 
    float scaleHeight = metrics.scaledDensity; 

    // create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 

    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); 
Смежные вопросы