我尝试使用:
//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。
答案 0 :(得分:1)
你自己说过,R.drawable.image
是一个整数 - 但是你试图将它传递给接受File
的方法,然后分配返回值(a Bitmap
)回到它。
此外,抓住FileNotFoundException
之类的东西只是吞下它是一个非常糟糕的主意 - 为什么不宣布该方法可能会抛出异常?
不清楚你真正想要做什么 - 或者R.drawable.image
真正想要实现的目标 - 但是为了使用你已经获得的方法,你清楚了需要File
。
答案 1 :(得分:1)
您是否尝试将drawable转换为File,然后将该File转换为Bitmap?
这将允许您将可绘制权限解码为位图:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image );
答案 2 :(得分: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对象了。码。如果您在设置之前需要对图像执行某些操作,则会有相应的setImageDrawable
和setImageBitmap
方法。
答案 3 :(得分:0)
VM不会让我们分配6291456个字节
您的图片大约是6兆字节未压缩,请参阅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);
}