当我上传到服务器时,相机图像旋转
Camera image gets rotated when I upload to server
我要么拍照,要么 select 从图库中拍摄照片,然后按原样在 ImageView 中显示(根据旋转)。但是,每当我将它上传到服务器时,它总是以横向模式上传,即使它在我的画廊中是纵向模式。我该如何解决?
private void takePhoto() {
Intent takePhoto = new Intent();
takePhoto.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = null;
try {
photoFile = imagePath();
} catch (IOException e) {
Log.d(TAG, "Take Photo: " + e.getMessage());
}
takePhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePhoto, REQUEST_IMAGE);
}
private File imagePath() throws IOException {
String timeStamp = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMAGE_" + timeStamp + "_";
File storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDirectory);
mImageLocation = image.getAbsolutePath();
return image;
}
private void uploadMultipart() {
String name = etName.getText().toString();
String path = mImageLocation;
try {
String uploadId = UUID.randomUUID().toString();
new MultipartUploadRequest(this, uploadId, API.IMAGE_UPLOAD_URL)
.addFileToUpload(path, "image")
.addParameter("name", name)
.setNotificationConfig(new UploadNotificationConfig())
.setMaxRetries(2)
.startUpload();
} catch (Exception e) {
Log.d(TAG, "Upload: " + e.getMessage());
}
}
private Bitmap setReducedImageSize() {
int targetImageViewWidth = capturedPhoto.getWidth();
int targetImageViewHeight = capturedPhoto.getHeight();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mImageLocation, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth / targetImageViewWidth, cameraImageHeight / targetImageViewHeight);
bmOptions.inSampleSize = scaleFactor;
bmOptions.inJustDecodeBounds = false;
/*Bitmap reducedPhoto = BitmapFactory.decodeFile(mImageLocation, bmOptions);
capturedPhoto.setImageBitmap(reducedPhoto);*/
return BitmapFactory.decodeFile(mImageLocation, bmOptions);
}
private void rotateImage(Bitmap bitmap) {
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(mImageLocation);
} catch (IOException e) {
Log.d(TAG, "Rotate Image: " + e.getMessage());
}
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(270);
break;
default:
}
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
capturedPhoto.setImageBitmap(rotatedBitmap);
}
几周前我花了一些时间来面对同样的问题。我做了一些挖掘,这就是我所做的,以便始终以正确的方向上传我的照片 :)。它每次都适用于每台设备。希望对你有帮助。
//this is the byte stream that I upload.
public static byte[] getStreamByteFromImage(final File imageFile) {
Bitmap photoBitmap = BitmapFactory.decodeFile(imageFile.getPath());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
int imageRotation = getImageRotation(imageFile);
if (imageRotation != 0)
photoBitmap = getBitmapRotatedByDegree(photoBitmap, imageRotation);
photoBitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
return stream.toByteArray();
}
private static int getImageRotation(final File imageFile) {
ExifInterface exif = null;
int exifRotation = 0;
try {
exif = new ExifInterface(imageFile.getPath());
exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
} catch (IOException e) {
e.printStackTrace();
}
if (exif == null)
return 0;
else
return exifToDegrees(exifRotation);
}
private static int exifToDegrees(int rotation) {
if (rotation == ExifInterface.ORIENTATION_ROTATE_90)
return 90;
else if (rotation == ExifInterface.ORIENTATION_ROTATE_180)
return 180;
else if (rotation == ExifInterface.ORIENTATION_ROTATE_270)
return 270;
return 0;
}
private static Bitmap getBitmapRotatedByDegree(Bitmap bitmap, int rotationDegree) {
Matrix matrix = new Matrix();
matrix.preRotate(rotationDegree);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
我要么拍照,要么 select 从图库中拍摄照片,然后按原样在 ImageView 中显示(根据旋转)。但是,每当我将它上传到服务器时,它总是以横向模式上传,即使它在我的画廊中是纵向模式。我该如何解决?
private void takePhoto() {
Intent takePhoto = new Intent();
takePhoto.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = null;
try {
photoFile = imagePath();
} catch (IOException e) {
Log.d(TAG, "Take Photo: " + e.getMessage());
}
takePhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePhoto, REQUEST_IMAGE);
}
private File imagePath() throws IOException {
String timeStamp = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMAGE_" + timeStamp + "_";
File storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName, ".jpg", storageDirectory);
mImageLocation = image.getAbsolutePath();
return image;
}
private void uploadMultipart() {
String name = etName.getText().toString();
String path = mImageLocation;
try {
String uploadId = UUID.randomUUID().toString();
new MultipartUploadRequest(this, uploadId, API.IMAGE_UPLOAD_URL)
.addFileToUpload(path, "image")
.addParameter("name", name)
.setNotificationConfig(new UploadNotificationConfig())
.setMaxRetries(2)
.startUpload();
} catch (Exception e) {
Log.d(TAG, "Upload: " + e.getMessage());
}
}
private Bitmap setReducedImageSize() {
int targetImageViewWidth = capturedPhoto.getWidth();
int targetImageViewHeight = capturedPhoto.getHeight();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mImageLocation, bmOptions);
int cameraImageWidth = bmOptions.outWidth;
int cameraImageHeight = bmOptions.outHeight;
int scaleFactor = Math.min(cameraImageWidth / targetImageViewWidth, cameraImageHeight / targetImageViewHeight);
bmOptions.inSampleSize = scaleFactor;
bmOptions.inJustDecodeBounds = false;
/*Bitmap reducedPhoto = BitmapFactory.decodeFile(mImageLocation, bmOptions);
capturedPhoto.setImageBitmap(reducedPhoto);*/
return BitmapFactory.decodeFile(mImageLocation, bmOptions);
}
private void rotateImage(Bitmap bitmap) {
ExifInterface exifInterface = null;
try {
exifInterface = new ExifInterface(mImageLocation);
} catch (IOException e) {
Log.d(TAG, "Rotate Image: " + e.getMessage());
}
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(270);
break;
default:
}
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
capturedPhoto.setImageBitmap(rotatedBitmap);
}
几周前我花了一些时间来面对同样的问题。我做了一些挖掘,这就是我所做的,以便始终以正确的方向上传我的照片 :)。它每次都适用于每台设备。希望对你有帮助。
//this is the byte stream that I upload.
public static byte[] getStreamByteFromImage(final File imageFile) {
Bitmap photoBitmap = BitmapFactory.decodeFile(imageFile.getPath());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
int imageRotation = getImageRotation(imageFile);
if (imageRotation != 0)
photoBitmap = getBitmapRotatedByDegree(photoBitmap, imageRotation);
photoBitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
return stream.toByteArray();
}
private static int getImageRotation(final File imageFile) {
ExifInterface exif = null;
int exifRotation = 0;
try {
exif = new ExifInterface(imageFile.getPath());
exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
} catch (IOException e) {
e.printStackTrace();
}
if (exif == null)
return 0;
else
return exifToDegrees(exifRotation);
}
private static int exifToDegrees(int rotation) {
if (rotation == ExifInterface.ORIENTATION_ROTATE_90)
return 90;
else if (rotation == ExifInterface.ORIENTATION_ROTATE_180)
return 180;
else if (rotation == ExifInterface.ORIENTATION_ROTATE_270)
return 270;
return 0;
}
private static Bitmap getBitmapRotatedByDegree(Bitmap bitmap, int rotationDegree) {
Matrix matrix = new Matrix();
matrix.preRotate(rotationDegree);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}