【问题标题】:Android can't compress a recycled BitmapAndroid 无法压缩回收的位图
【发布时间】:2016-09-14 15:48:47
【问题描述】:

我从 URL 获取图像,我想将其压缩并保存在外部存储设备中。我收到此错误

java.lang.IllegalStateException: 无法压缩回收的位图 在 android.graphics.Bitmap.checkRecycled(Bitmap.java:400) 在 android.graphics.Bitmap.compress(Bitmap.java:1307)

在这一行

 mIcon11.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

String foto = UT_drive_dropbox.AM.getfoto();
Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(foto).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
final Bitmap output = Bitmap.createBitmap(mIcon11.getWidth(),
            mIcon11.getHeight(), Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(output);

    final int color = Color.RED;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, mIcon11.getWidth(), mIcon11.getHeight());
    final RectF rectF = new RectF(rect);

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawOval(rectF, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(mIcon11, rect, rect, paint);

    mIcon11.recycle();


    String fileName = "avatar.jpg";
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
     mIcon11.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

    File sd = new File(Environment.getExternalStorageDirectory(), getString(R.string.app_name) + File.separator + fileName);

    FileOutputStream fileOutputStream = null;
    try {
        sd.createNewFile();
        fileOutputStream = new FileOutputStream(sd);
        fileOutputStream.write(bytes.toByteArray());

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (fileOutputStream != null) {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

【问题讨论】:

    标签: android url bitmap


    【解决方案1】:

    错误消息是“无法压缩回收的位图”。如果您在 mIcon11.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 行之前查看三行,您将看到:

    mIcon11.recycle();
    

    所以,要么删除recycle(),要么将其移动到你已经完成所有你打算用@987654325指向的Bitmap做的事情 @。

    【讨论】:

    • 只是补充一点,recycle() 应该只在您完成对象后调用。把它和物体放在中间是 100% 错误的,就像喝了一杯饮料,中途把它扔进回收箱,然后想知道为什么你不能再喝饮料了。
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2013-11-15
    相关资源
    最近更新 更多