问题

我有一个应用程序使用本机 Camera 捕获照片,然后将其上传到服务器.我的问题是所有的照片有一个EXIF取向值为0,这会弄乱显示在其他地方.

如何更改EXIF方向?我不是在寻找一种方法来纠正它在任何情况下,只是改变到一个不同的值.

我使用的是Samsung Galaxy Note 4

我尝试了在拍摄照片前设置相机方向的解决方案:设置Android照片EXIF方向< / a>

Camera c = Camera.open();
c.setDisplayOrientation(90);

Camera.Parameters params = mCamera.getParameters();
params.setRotation(0); // tried 0, 90, 180
c.setParameters(params);

但它不会影响产生的EXIF数据,它仍然始终为0

我也尝试过这些解决方案,其中的图像旋转后,采取: EXIF方向标记值始终为0,使用纵向相机应用程序Android 拍摄的图像

并且在旋转照片时,EXIF方向始终为0.

我也尝试直接设置EXIF数据:如何在Android中位图压缩后保存Exif数据

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        final File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE, "");
        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);

            ExifInterface exif = new ExifInterface(pictureFile.toString());
            exif.setAttribute(ExifInterface.TAG_ORIENTATION, "3");
            exif.saveAttributes();

            fos.write(data);
            fos.close();

            //upload photo..
        }
    }
}

但上传后EXIF方向仍为0.

我也看过这些解决方案:

Exif数据TAG_ORIENTATION始终为0

如何在Android中将exif数据写入图像?< / a>

如何以获取从默认图片库中选择的图片的正确方向

如何设定相机图片方向?

但它们都涉及通过旋转校正方向,这不会影响EXIF数据,或直接设置EXIF数据似乎无效.

如何将文件的EXIF方向数据从0更改为3?

更新:

这是我的上传代码:

Bitmap sBitmap = null;
final File sResizedFile = getOutputMediaFile(MEDIA_TYPE_IMAGE, "_2");
try {
    sBitmap = BitmapFactory.decodeStream(new FileInputStream(pictureFile), null, options);
} catch (FileNotFoundException e) {
    Log.e("App", "[MainActivity] unable to convert pictureFile to bitmap");
    e.printStackTrace();
    return;
}

// ... compute sw and sh int values

Bitmap sOut = Bitmap.createScaledBitmap(sBitmap, sw, sh, false);
Bitmap rotatedBitmap = rotateBitmap(sOut, 3);
FileOutputStream sfOut;
try {
    sfOut = new FileOutputStream(sResizedFile);
    rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, sfOut);
    sfOut.flush();
    sfOut.close();
    sBitmap.recycle();
    sOut.recycle();
    rotatedBitmap.recycle();
} catch (Exception e) {
    Log.e("App", "[MainActivity] unable to save thumbnail");
    e.printStackTrace();
    return;
}
// upload small thumbnail
TransferObserver sObserver = transferUtility.upload(
            "stills/small",        /* The bucket to upload to */
            filename + ".jpg",     /* The key for the uploaded object */
            sResizedFile           /* The file where the data to upload exists */
);


解决方法

结果我的代码能够设置EXIF数据,但是在Android如何解释这些数据和Mac和Mac(我正在检查生成的文件)解释它之间有一个差异.

这是设置EXIF方向所需的唯一代码:

ExifInterface exif = new ExifInterface(pictureFile.toString());
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "3");
exif.saveAttributes();

但是,在iOS上将 3 设置为 0

在iOS上将 6 设置为 3 ,图片在Chrome中显示正确.




相关问题推荐