Недавно мне понадобилось получить из внешнего потока (InputStream) картинку и вывести ее на экран, но картинка была в одном размере и ее нужно было под разные экраны и условия уменьшить или увеличить.
Для начала получим из потока Drawable. Например с assets каталога:
Для начала получим из потока 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);
}
Этот метод я запостил скорей чтобы не забыть, потому как в проекте он уже не нужен, и дабы помочь ищущему. Но я думаю есть другие варианты решения, если кто наткнулся на пост и знает, то плиз в комментарии.
Спасибо
ОтветитьУдалитьСбасибо за краткое решение моей проблеммы, над которай я просидел пол дня.
ОтветитьУдалитьНе получалось нормально сохранить пропорции при измении, но с классом Matrix это делается очень просто.
Спасибо. Очень помогло в моей проблеме.
ОтветитьУдалитьСпасибо большое
ОтветитьУдалитьтолько у меня исходный код не заработал, пришлось немного допилить:
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(), но с этим у меня проблемы
Попробовал предложенный вариант автора, но почему-то у меня теряются пропорции, а это очень плохо. У остальных всё ок ?
ОтветитьУдалитьСпасибо, помогло очень !!!!!!!!
ОтветитьУдалить