Android 如何在不调整流大小的情况下从流创建可绘制文件?
如果我的应用程序的最小目标SDK设置为4,则所有对Drawable.createFromStream的调用都会调整图像大小 e、 g.如果源图像的宽度为480px,并且运行我的应用程序的Android设备的密度为1.5,则以下代码返回宽度为320的BitmapDrawableAndroid 如何在不调整流大小的情况下从流创建可绘制文件?,android,Android,如果我的应用程序的最小目标SDK设置为4,则所有对Drawable.createFromStream的调用都会调整图像大小 e、 g.如果源图像的宽度为480px,并且运行我的应用程序的Android设备的密度为1.5,则以下代码返回宽度为320的BitmapDrawable URL url = new URL("http://www.examples.com/something.png"); Drawable d = Drawable.createFromStream(url.openStr
URL url = new URL("http://www.examples.com/something.png");
Drawable d = Drawable.createFromStream(url.openStream(), "something.png");
是否有方法强制其保持不变或指定从输入流返回图像的比例(ldpi/mdpi/hdpi等)
编辑:下面的解决方案
Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);
您可以将图像作为位图加载。这样,它的大小将保持不变
BitmapFactory.decodeStream(...)
或者您可以尝试
BitmapDrawable(InputStream是)
构造函数。它已被弃用,但我想它应该可以完成这项工作。过了很长时间,我遇到了以下解决方案。它起作用了。它从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;
}
private Drawable getDrawableForStore(字符串localLink){
位图缩略图=空;
试一试{
File filePath=this.getFileStreamPath(localLink);
FileInputStream fi=新的FileInputStream(filePath);
缩略图=BitmapFactory.decodeStream(fi);
}捕获(例外情况除外){
e(“内部存储上的getThumbnail()”,例如getMessage());
返回null;
}
DisplayMetrics=新的DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(度量);
float scaledDensity=metrics.density;
int width=thumbnail.getWidth();
int height=thumbnail.getHeight();
如果(缩放密度从ImageView适配器中的本地资源加载图像
我被Koushik Dutta的ion中的OOM错误所困扰,因为从资源文件夹加载的图像低至2个。甚至他也提到可能会发生这种情况,因为它们不是数据流。并建议将它们作为InputStream加载
我扔掉了ion图书馆,因为我只想要4张当地的图片
下面是简单ImageView的解决方案
在RecycleServiceAdapter内/或任何地方
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");
希望能有所帮助。我会使用BitmapDrawable()
方法,因为它直截了当。它已被弃用,但不适用于API级别4。理想情况下,您会使用BitmapDrawable(资源,InputStream)
,但在API级别5之前您无法使用它。另一种选择是执行类似于BitmapDrawable的操作(参考资料,new BitmapFactory().decodeStream(InputStream))
,可在API级别4(但不低于此级别)上使用。这非常有用。我添加了一个编辑来演示如何转换为BitmapDrawable。