如何在不丢失EXIF的情况下上传JPEG图像



这是我创建文件格式的地方

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new 
    Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
     Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );
    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    Log.e("Getpath", "Cool" + mCurrentPhotoPath);
    return image;
}

在这里,我保存我的字符串以将其发送到我的Web服务(REST(

private String setPic(ImageView v) throws IOException {
    // Get the dimensions of the View
    targetW = 320;
    targetH = 250;
    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;
    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;
    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
    v.setImageBitmap(bitmap);
    v.setVisibility(View.VISIBLE);
    if (PICTURE_DNI){
        timeStapDNI = new Date().getTime();
    }else{
        timeStapSign =new Date().getTime();
    }
    File filePhoto = new File(mCurrentPhotoPath);
    FileInputStream fis = new FileInputStream(filePhoto);
    Bitmap bi = BitmapFactory.decodeStream(fis); // EXIF info lost
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bi.compress(Bitmap.CompressFormat.JPEG, 50, baos);
    byte[] data = baos.toByteArray();
    String  encodedPrueba = Base64.encodeToString(data,Base64.DEFAULT);
    Log.i("Data Input ", "" + encodedPrueba);
     v.setImageBitmap(bitmap);
    return encodedPrueba;
}

主要问题是我正在失去EXIF。另一种方式,但太慢而无法将其发送到 Web 服务:

File filePhoto = new File(mCurrentPhotoPath);
byte[] fileData = new byte[(int) filePhoto.length()];
DataInputStream dis = new DataInputStream(new 
FileInputStream(filePhoto));
dis.readFully(fileData);
dis.close();
String  encodedPrueba = Base64.encodeToString(fileData,Base64.DEFAULT);

我正在使用改造来发送信息。服务必须接收文件的字符串(编码的Prueba(。

主要问题是我正在失去EXIF。

是的。JPEG 文件可能包含 EXIF 信息。Bitmap则不然。默认情况下,从Bitmap创建的 JPEG 不会。您需要从原始 JPEG 中读取 EXIF 信息,并将相同的信息(或根据需要进行调整(添加到新的 JPEG 中。

最新更新