воскресенье, 30 октября 2011 г.

Android: Как изменить размер BitmapDrawable

Недавно мне понадобилось получить из внешнего потока (InputStream) картинку и вывести ее на экран, но картинка была в одном размере и ее нужно было под разные экраны и условия уменьшить или увеличить.

Для начала получим из потока Drawable. Например с assets каталога:
  Drawable drawable = Drawable.createFromStream(act.getAssets().open(fileName), null);
И для того, чтобы изменить размер, я использую следующий метод:
  public static Drawable resizeDrawable(Drawable drawable, int newWidth, int newHeight) {
    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
        width, height, matrix, true);
    return new BitmapDrawable(resizedBitmap);
  }
Этот метод я запостил скорей чтобы не забыть, потому как в проекте он уже не нужен, и дабы помочь ищущему. Но я думаю есть другие варианты решения, если кто наткнулся на пост и знает, то плиз в комментарии.


6 комментариев:

  1. Сбасибо за краткое решение моей проблеммы, над которай я просидел пол дня.
    Не получалось нормально сохранить пропорции при измении, но с классом Matrix это делается очень просто.

    ОтветитьУдалить
  2. Спасибо. Очень помогло в моей проблеме.

    ОтветитьУдалить
  3. Спасибо большое
    только у меня исходный код не заработал, пришлось немного допилить:
    public static Bitmap resize(Bitmap bit, int newWidth, int newHeight) {

    int width = bit.getWidth();
    int height = bit.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    Bitmap resizedBitmap = Bitmap.createBitmap(bit, 0, 0,
    width, height, matrix, true);
    return resizedBitmap;
    }
    и потом используем так: canvas.drawBitmap(resize(bmp,320,240), x, y, null);
    вместо 320 и 240 надо поставить getWidth() и getHeight(), но с этим у меня проблемы

    ОтветитьУдалить
  4. Попробовал предложенный вариант автора, но почему-то у меня теряются пропорции, а это очень плохо. У остальных всё ок ?

    ОтветитьУдалить
  5. Спасибо, помогло очень !!!!!!!!

    ОтветитьУдалить