You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中裁剪图片后压缩Bitmap(10%/1000*1000)并转Base64上传方案

完整实现:Android裁剪图片后压缩、转尺寸并生成Base64

针对你的需求,我来补全并优化handleCrop方法,结合你提到的裁剪库,完成从裁剪结果到Base64的全流程处理:

private void handleCrop(int resultCode, Intent result) throws IOException {
    if (resultCode == RESULT_OK && result != null) {
        // 1. 获取裁剪后的图片Uri
        Uri croppedUri = Crop.getOutput(result);
        if (croppedUri == null) {
            Toast.makeText(this, "裁剪失败,未获取到图片", Toast.LENGTH_SHORT).show();
            return;
        }

        // 2. 将Uri转换为Bitmap(加入采样优化避免OOM)
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = false;
        // 可选:如果裁剪后的原图过大,可以先设置inSampleSize降低采样率
        // options.inSampleSize = calculateInSampleSize(options, 1000, 1000);
        InputStream inputStream = getContentResolver().openInputStream(croppedUri);
        Bitmap originalBitmap = BitmapFactory.decodeStream(inputStream, null, options);
        if (originalBitmap == null) {
            Toast.makeText(this, "图片转换Bitmap失败", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            // 3. 调整Bitmap尺寸到1000*1000
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, 1000, 1000, true);
            // 回收原Bitmap释放内存
            originalBitmap.recycle();

            // 4. 压缩Bitmap到10%质量
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 10, baos);
            scaledBitmap.recycle(); // 回收缩放后的Bitmap

            // 5. 转换为Base64格式
            String base64Image = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
            baos.close();

            // 这里就可以把base64Image发送到服务器了
            sendImageToServer(base64Image);

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "图片处理失败", Toast.LENGTH_SHORT).show();
        }
    } else if (resultCode == Crop.RESULT_ERROR) {
        Exception error = Crop.getError(result);
        Toast.makeText(this, "裁剪错误:" + error.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

// 辅助方法:计算采样率(可选,用于处理超大原图)
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }
    return inSampleSize;
}

// 模拟发送到服务器的方法
private void sendImageToServer(String base64Image) {
    // 这里实现你的网络请求逻辑,比如用Retrofit、OkHttp等
}

关键步骤说明:

  • 裁剪结果获取:通过Crop.getOutput(result)拿到裁剪后的图片Uri,同时处理Crop.RESULT_ERROR的错误情况,给用户明确的提示。
  • Bitmap转换优化:加入BitmapFactory.Options可以避免大图片导致的内存溢出,可选的calculateInSampleSize方法能帮你对超大原图进行采样压缩,进一步降低内存占用。
  • 尺寸调整:用Bitmap.createScaledBitmap直接将图片缩放到1000*1000,第三个参数true表示启用双线性过滤,保证缩放后的图片不会太模糊。
  • 质量压缩:compress方法的第二个参数设为10,代表10%的压缩质量,格式选JPEG(如果需要保留透明通道可以用PNG,但PNG格式的压缩质量参数无效)。
  • Base64转换:用Base64.encodeToString将压缩后的字节数组转为字符串,注意如果服务器要求无换行的Base64,可以把Base64.DEFAULT换成Base64.NO_WRAP。

注意事项:

  • 记得在处理完Bitmap后调用recycle()释放内存,避免长时间占用内存导致泄漏。
  • 发送Base64到服务器的操作一定要放在子线程中执行,别阻塞主线程造成界面卡顿。
  • 权限方面,Android 10及以下需要申请READ_EXTERNAL_STORAGE权限,Android 10+可以直接使用媒体库访问框架,不需要额外权限。

内容的提问来源于stack exchange,提问作者BoboGoooool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:19:13