将 Android Intent 数据保存到图像文件
Posted
技术标签:
【中文标题】将 Android Intent 数据保存到图像文件【英文标题】:saving Android Intent data to image File 【发布时间】:2021-09-04 03:15:44 【问题描述】:我从裁剪图像方法中通过 Intent(onActivityResult) 获取数据并将其保存在文件中。
我的挑战是我得到的文件(图像)减少到 ~50KB,这是不可接受的,因为图像必须是 ~500KB 才能使用。
我可以根据裁剪意图更改任何参数以获得更好的图像质量。
CropIntent = new Intent("com.android.camera.action.CROP");
另一个问题是我将意图数据转换为位图,然后保存。
有什么方法可以直接将 Intent 数据保存到文件中。
我的保存图片代码是 -
Bitmap bitmap = null;
try
Bundle bundle = data.getExtras();
bitmap = bundle.getParcelable("data");
imageView.setImageBitmap(bitmap);
catch (Exception e)
Log.d("ListView1", "Image view set exception: "+ e.toString());
try
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/NVoids/toServer.jpeg");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
final BufferedOutputStream bos = new BufferedOutputStream(fos, 1024 * 8);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
fos.close();
catch (Exception e)
Log.d("ListView1", "Save to file exception: "+ e.toString());
我的裁剪图像功能是-
public void ImageCropFunction()
// Image Crop Code
try
try
Log.d("ListView1", "ImageUri: " + imageUri.toString()); catch ( Exception e) Log.d("ListView1", "ImageUri exception: " + e.toString());
CropIntent = new Intent("com.android.camera.action.CROP");
CropIntent.setDataAndType(imageUri, "image/*");
CropIntent.putExtra("crop", "true");
CropIntent.putExtra("outputX", 50000);
CropIntent.putExtra("outputY", 50000);
CropIntent.putExtra("aspectX", 1);
CropIntent.putExtra("aspectY", 1);
CropIntent.putExtra("scaleUpIfNeeded", true);
CropIntent.putExtra("return-data", true);
startActivityForResult(CropIntent, 1);
catch (ActivityNotFoundException e)
Log.d("ListView1", "ImageCropFunction Activity Not Found exception: " + e.toString());
catch (Exception e)
Log.d("ListView1", "ImageCropFunction exception: " + e.toString());
如果您想查看整个活动文件 here it is 和 layout file
【问题讨论】:
【参考方案1】:没有 Intent 属性来指定生成图像的大小(以字节为单位),只有“outputX”和“outputY”来控制宽度和高度,以及“scale”、“aspectX”和“aspectY”等相关项你已经在使用了。
但是,您获得的图像可能比裁剪功能实际产生的图像更小,因为正如文档所述(强调我的),
调用者可能会传递一个额外的 EXTRA_OUTPUT 来控制此图像的位置 将被写入。 如果 EXTRA_OUTPUT 不存在,那么小 大小的图像在额外字段中作为 Bitmap 对象返回。 这是 对于只需要小图像的应用程序很有用。如果 EXTRA_OUTPUT 存在,那么全尺寸图像将被写入 EXTRA_OUTPUT 的 Uri 值。
这也是解决第二个问题的关键。 您不必自己编写图像 - 您应该将要写入的文件的位置放在意图的 EXTRA_OUTPUT 中,并让执行裁剪的代码写入文件。
TLDR;将文件的目的地放入 Intent 的 EXTRA_OUTPUT 中,该文件将为您写入,如果您不这样做,可能会比返回的文件大。
【讨论】:
以上是关于将 Android Intent 数据保存到图像文件的主要内容,如果未能解决你的问题,请参考以下文章