0

我尝试使用:

//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f)
{
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //The new size we want to scale to
        final int REQUIRED_SIZE=70;

        //Find the correct scale value. It should be the power of 2.
        int scale=1;
        while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
            scale*=2;

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
}

然后

R.drawable.image = decodeFile(R.drawable.image);

如何使用这种方法?R.drawable.image 是整数,所以它给了我错误,我该如何解码文件?我将 240kb 图像添加到 textview。

4

4 回答 4

1

好吧,您自己说过,R.drawable.image是一个整数-但是您试图将其传递给接受 a 的方法File,然后将返回值 (a Bitmap) 分配回给它。

此外,像这样捕获FileNotFoundException并吞下它是一个非常糟糕的主意 - 为什么不直接声明该方法可能会引发异常?

目前尚不清楚你真正想要做什么——或者R.drawable.image真正想要实现什么——但为了使用你所拥有的方法,你显然需要一个File.

于 2012-08-27T18:16:20.367 回答
1

您是否尝试将可绘制对象转换为文件,然后将该文件转换为位图?

这将允许您解码位图的可绘制权限:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image );
于 2012-08-27T18:22:52.410 回答
0

VM 不会让我们分配 6291456 字节

您的图像大约 6 MB 未压缩,请参阅http://developer.android.com/training/displaying-bitmaps/index.html

如果您想加载可能需要的该图像的缩小版本,因为您似乎内存不足,它可以使用以下代码

/** decodes image from resources to max maxSize x maxSize pixels */
private Bitmap decodeFile(Context context, int resId, int maxSize) {
    Resources res = context.getResources();
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, o);

    // Find the correct scale value. It should be the power of 2.
    int scale = 1;
    while (o.outWidth / scale / 2 >= maxSize && o.outHeight / scale / 2 >= maxSize)
        scale *= 2;

    // Decode with inSampleSize
    o.inJustDecodeBounds = false;
    o.inSampleSize = scale;
    return BitmapFactory.decodeResource(res, resId, o);
}
于 2012-08-27T18:39:31.053 回答
0

我想你可能正在寻找这样的东西:

Resources res = getResources();
Drawable image = res.getDrawable(R.drawable.image);

Android 允许您使用 Resources 类访问可绘制文件夹中的图像。他们还通过为不同分辨率的图像使用不同的文件夹来为您处理缩放。此外,如果您在 xml 中定义了一个小部件,您可以使用该android:src属性为它分配一个源可绘制对象,在您的情况下它是android:src="@drawable/image". 看一眼

http://developer.android.com/guide/topics/resources/drawable-resource.html

http://developer.android.com/training/multiscreen/screensizes.html

有关如何使用 Android 处理图像以及操作系统如何帮助您分别选择适当缩放的图像的更多信息。

编辑:还有一件事,如果您只是想为 ImageView 之类的东西设置图像资源,您可以使用imageView.setImageResource(R.drawable.image)这样您就不必在代码中创建 Drawable 或 Resources 对象。如果您需要在设置之前对图像进行一些操作,则有相应的setImageDrawablesetImageBitmap方法。

于 2012-08-27T18:30:57.957 回答