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

Android保存BLOB图片到SQLITE体积偏大,保留裁剪功能优化求助

你的猜测完全成立,核心原因是两个pickCamera实现的底层返回的图片规格完全不同:

  • 小体积版本的pickCamera没有指定MediaStore.EXTRA_OUTPUT参数,调用系统相机后返回的data.get("data")是系统生成的缩略图,默认分辨率极低,所以体积只有几十K。
  • 大体积版本的pickCamera指定了MediaStore.EXTRA_OUTPUT,相机拍摄的是全分辨率原图,直接保存到了你指定的Uri路径,哪怕经过裁剪,分辨率依然远高于系统缩略图,所以体积偏大。另外你的代码里还存在一个明显错误:裁剪完成后你跳转Activity时传递的还是拍摄原图的image_uri,根本没有用裁剪后的resultUri,相当于你存到SQLite的其实是没裁剪的原图,这也是体积大的核心原因之一。

解决方案(保留裁剪功能同时得到小体积图片)

按照以下步骤修改即可:

  1. 修正裁剪结果的传递逻辑:裁剪完成后传递裁剪后的resultUri,而非原图的image_uri
  2. 给裁剪组件设置输出尺寸限制,裁剪时直接生成你需要的目标分辨率
  3. 存储到SQLite前可对Bitmap做二次压缩,进一步控制体积

修改后的核心代码示例

首先给裁剪调用添加尺寸限制:

if (requestCode == IMAGE_PICK_CAMERA_CODE){
    CropImage.activity(image_uri)
    .setGuidelines(CropImageView.Guidelines.ON)
    .setRequestedSize(182, 250) // 按需调整为你需要的目标分辨率
    .start(this);
}

修正裁剪完成后的跳转逻辑:

if(resultCode ==RESULT_OK){
    Uri resultUri = result.getUri(); // 裁剪后的图片Uri
    // 其余原有逻辑不变
    Intent i = new Intent(ScanCashCard.this, ScannedDetails.class);
    // 这里传裁剪后的Uri,不要传原来的image_uri
    i.putExtra("CashCardImage",resultUri.toString());
    startActivity(i);
}

如果需要进一步压缩体积,在存SQLite前添加压缩逻辑:

// 拿到Bitmap后执行压缩
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 第二个参数为质量,范围0-100,数值越低体积越小,可按需调整
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
byte[] imageBlob = bos.toByteArray();
// 把imageBlob存入SQLite即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:06:03