将 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 数据保存到图像文件的主要内容,如果未能解决你的问题,请参考以下文章

裁剪图像 Android Kotlin

Android中的图像上传

一起学Android之Intent

Android:如何保存数据(Intent's Data)

将数据保存到电子邮件中:

android:怎样将Uri类型的图片数据转换成流