Android保存BLOB图片到SQLITE体积偏大,保留裁剪功能优化求助
你的猜测完全成立,核心原因是两个pickCamera实现的底层返回的图片规格完全不同:
- 小体积版本的
pickCamera没有指定MediaStore.EXTRA_OUTPUT参数,调用系统相机后返回的data.get("data")是系统生成的缩略图,默认分辨率极低,所以体积只有几十K。 - 大体积版本的
pickCamera指定了MediaStore.EXTRA_OUTPUT,相机拍摄的是全分辨率原图,直接保存到了你指定的Uri路径,哪怕经过裁剪,分辨率依然远高于系统缩略图,所以体积偏大。另外你的代码里还存在一个明显错误:裁剪完成后你跳转Activity时传递的还是拍摄原图的image_uri,根本没有用裁剪后的resultUri,相当于你存到SQLite的其实是没裁剪的原图,这也是体积大的核心原因之一。
解决方案(保留裁剪功能同时得到小体积图片)
按照以下步骤修改即可:
- 修正裁剪结果的传递逻辑:裁剪完成后传递裁剪后的
resultUri,而非原图的image_uri - 给裁剪组件设置输出尺寸限制,裁剪时直接生成你需要的目标分辨率
- 存储到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
相关产品推荐
相关产品推荐

