我的drawable文件夹中有大量资源。所有大小都超过500KB。我必须在srollView中一次性加载所有这25个图像。像往常一样,我的内存不足。有没有办法以编程方式减小图像的大小。
我有这个功能,但它的参数是一个文件,我不知道如何从drawable创建一个文件。
private Bitmap decodeFile(File f){ Bitmap b = null; try { //Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; FileInputStream fis = new FileInputStream(f); BitmapFactory.decodeStream(fis, null, o); fis.close(); int scale = 1; if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { scale = Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))); } //Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; fis = new FileInputStream(f); b = BitmapFactory.decodeStream(fis, null, o2); fis.close(); } catch (FileNotFoundException e) { } return b; }
在经过多次遍历系统显示内存不足并且正在从堆栈中删除后面的其他视图后,我必须多次循环访问此屏幕,但实际上我需要它。 请帮帮我。
答案 0 :(得分:32)
您可以使用以下代码从可绘制资源中打开InputStream:
InputStream is = getResources().openRawResource(id);
此处id
是可绘制资源的标识符。例如:R.drawable.abc
现在使用此输入流可以创建文件。如果您还需要有关如何使用此输入流创建文件的帮助,请告诉我。
更新:在文件中写入数据:
try
{
File f=new File("your file name");
InputStream inputStream = getResources().openRawResource(id);
OutputStream out=new FileOutputStream(f);
byte buf[]=new byte[1024];
int len;
while((len=inputStream.read(buf))>0)
out.write(buf,0,len);
out.close();
inputStream.close();
}
catch (IOException e){}
}
答案 1 :(得分:0)
我喜欢快捷方式,所以我更喜欢使用this。
要从drawable创建文件,请参阅this。
将其放入 build.gradle
compile 'id.zelory:compressor:1.0.4'
无论你想在哪里压缩图像
Bitmap compressedImageFile = Compressor.getDefault(context).compressToBitmap(your_file);
README.md提供了更多信息。很抱歉在6年后提出答案。
答案 2 :(得分:0)
兄弟有两种方法
只需使用Bitmap.createScaledBitmap
方法压缩 drawables
//步骤1加载drawable并将其转换为位图
Bitmap b = BitmapFactory.decodeResource( context , resId )
//第2步重新调整您的位图
Bitmap nBitmap = b.createScaledBitmap( getResources() , newHieght , newWidth , true );
//步骤3从位图创建一个drawable
BitmapDrawable drawable = new BitmapDrawable(nBitmap);
我强烈建议您使用第三方库,因为这种方法非常昂贵
喜欢https://github.com/Tourenathan-G5organisation/SiliCompressor
答案 3 :(得分:-1)
我从@ mudit的答案中获取了提示并从输入流中创建了可绘制的。然后将drawable加载到适配器中的ImageView。
InputStream inputStream = mContext.getResources()。openRawResource(R.drawable.your_id);
Bitmap b = BitmapFactory.decodeStream(inputStream);
b.setDensity(Bitmap.DENSITY_NONE);
Drawable d = new BitmapDrawable(b);
mImageView.setImageDrawable(d);
Here是解决方案的详细版本