Android 如何在不调整流大小的情况下从流创建可绘制文件?

Android 如何在不调整流大小的情况下从流创建可绘制文件?,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

如果我的应用程序的最小目标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.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。