如何压缩图像而不丢失其元数据?

时间:2019-04-19 04:20:04

标签: android compression metadata

我需要先压缩图像,然后再通过Android应用将图像发送到服务器。通过相机拍摄的图像非常大,需要首先对其进行压缩。从相机拍摄图像时,有一些与图像相关的属性,例如设备型号,光圈,位置等。

我正在尝试压缩图像,但是在压缩过程中,图像的那些属性丢失了。如果缺少任何代码行或任何库来压缩图像而不丢失这些属性,请提供帮助。

  private void compressImageAndAddToArrayList(Uri imageURI) {
    Bitmap bm = null;
    try
    {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 2;
        // bm = Media.getBitmap(mContext.getContentResolver(), imageLoc);
        bm = BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(imageURI), null, options);

        File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "VDMS" + File.separator + "Camera");
        folder.mkdirs();
        String now = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(new Date()).toString();
        String fileName = caseID +  "_" + now + ".jpg";
        File imageFile = new File(folder + File.separator + fileName);

        FileOutputStream out = new FileOutputStream(imageFile);
        bm.compress(Bitmap.CompressFormat.JPEG, 64, out); // quality ranges from 0-100
        bm.recycle();

        addDocumentToArrayList(String.valueOf(1), Uri.fromFile(imageFile));
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:-1)

您可以使用调整图像大小而不是使用压缩来做到这一点。

这里是调整大小的代码

  •  public static Bitmap scaleDown(Bitmap realImage, float maxImageSize, boolean filter) 
      {
    
      float ratio = Math.min((float) maxImageSize / realImage.getWidth(), 
       (float)maxImageSize / realImage.getHeight());
    
       int width = Math.round((float) ratio * realImage.getWidth());
       int height = Math.round((float) ratio * realImage.getHeight());
    
       Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width, height,filter);
    
        return newBitmap;
    
    
     }