Как создать Drawable из потока без изменения его размера?
Если для моего приложения установлен минимальный целевой SDK для 4, то все вызовы Drawable.createFromStream изменяют размер изображений.
например, если исходное изображение имеет ширину 480 пикселей и устройство Android, на котором запущено мое приложение, имеет плотность 1,5, то следующий код возвращает BitmapDrawable с шириной 320
URL url = new URL("http://www.examples.com/something.png");
Drawable d = Drawable.createFromStream(url.openStream(), "something.png");
Есть ли метод, чтобы заставить его быть неизменным или указать масштаб (ldpi/mdpi/hdpi etC) для возврата изображения из InputStream?
Изменить: решение снизу.
Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);
3 ответа
Вы можете загрузить изображение как растровое изображение. Таким образом, его размер не изменится.
BitmapFactory.decodeStream(...)
Или вы можете попробовать BitmapDrawable(InputStream is)
конструктор. Это устарело, но я думаю, что это должно сделать работу.
Загрузка изображений с локального ресурса в ImageView Adapter
Я застрял с ошибкой OOM в ion от Koushik Dutta, так как всего 2 изображения загружались из папки ресурсов. Даже он упомянул, что это может произойти, поскольку они не являются потоками данных. и предложил загрузить их как InputStream.
Я забросил Библиотеку, так как я хотел только 4 изображения из местных.
вот решение с простым ImageView.
внутри RecyclerViewAdapter/ или в любом другом месте
InputStream inputStream = mContext.getResources().openRawResource(R.drawable.your_id);
Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);
holder.mImageView.setImageDrawable(d);
Хотя Drawable d = new BitmapDrawable(b); устарела, но делает работу довольно хорошо.
так что вместо этого мы можем напрямую получить отрисовку из InputStream только этой строкой..
Drawable d = Drawable.createFromStream(inputStream,"src");
Надеюсь, поможет.
Спустя долгое время я наткнулся на следующее решение. Оно работает. Получает создает растровое изображение из файла на locallink.
private Drawable getDrawableForStore(String localLink) {
Bitmap thumbnail = null;
try {
File filePath = this.getFileStreamPath(localLink);
FileInputStream fi = new FileInputStream(filePath);
thumbnail = BitmapFactory.decodeStream(fi);
} catch (Exception ex) {
Log.e("getThumbnail() on internal storage", ex.getMessage());
return null;
}
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float scaledDensity = metrics.density;
int width = thumbnail.getWidth();
int height = thumbnail.getHeight();
if(scaledDensity<1){
width = (int) (width *scaledDensity);
height = (int) (height *scaledDensity);
}else{
width = (int) (width +width *(scaledDensity-1));
height = (int) (height +height *(scaledDensity-1));
}
thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true);
Drawable d = new BitmapDrawable(getResources(),thumbnail);
return d;
}