如何在不丢失元数据的情况下压缩图像?

问题描述 投票:2回答:1

我需要在通过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();
    }
}
android compression metadata
1个回答
-1
投票

您可以使用不使用compress调整图像大小来执行此操作。

这是调整大小的代码

  • 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; }
© www.soinside.com 2019 - 2024. All rights reserved.