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
相关产品推荐
相关产品推荐

