在我的代码中,我允许用户从图库或相机上传照片。然后通过改造将图像存储到服务器中。如果使用手机的相机拍摄照片(无论是通过应用程序调用还是直接通过相机调用),检索时照片总是旋转90度。如果未使用相机拍摄图像,则方向正确。我该如何解决这个问题?
我知道如果我试图直接显示图像而不将其存储在服务器中,并且可能是正确的方向,因为我可以在显示之前旋转它。我在做类似代码的事情:https://gist.github.com/Mariovc/f06e70ebe8ca52fbbbe2。
但是因为我需要上传到服务器然后再次从服务器检索。如何在存储到服务器之前将其旋转,以便在检索时它已经处于正确的方向?
下面是我的代码的一些部分(只是一些常用的图像处理和displayAvatarInProfile()在服务完成图像下载后调用):
public void displayAvatarInProfile(String filePath) {
if(filePath != null && filePath != ""){
int targetW = mProfilePicImageView.getWidth();
int targetH = mProfilePicImageView.getHeight();
Bitmap bm = ImageStorageUtils.resizePic(filePath, targetW, targetH);
mProfilePicImageView.setImageBitmap(bm);
} else {
mProfilePicImageView.setImageBitmap(null);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == Activity.RESULT_OK) {
Uri fileUri = null;
String filePath = null;
switch(requestCode) {
case REQUEST_PICK_IMAGE:
fileUri = data.getData();
break;
case REQUEST_CAPTURE_IMAGE:
File imageFile = ImageStorageUtils.getFile(
getActivity().getResources().getString(R.string.ApptTitle),
"avatar_" + mUser.getLogin());
filePath = imageFile.getAbsolutePath();
fileUri = ImageStorageUtils.getUriFromFilePath(mContext.get(), filePath);
break;
default:
break;
}
if(fileUri != null) {
getActivity().startService(ProfileService.makeIntentUploadAvatar(
mContext.get(), mUser.getId(), fileUri));
}
}
}
public void pickImage() {
final Intent imageGalleryIntent =
new Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI)
.setType("image/*")
.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
// Verify the intent will resolve to an Activity.
if (imageGalleryIntent.resolveActivity(getActivity().getPackageManager()) != null)
// Start an Activity to get the Image from the Image Gallery
startActivityForResult(imageGalleryIntent,
DisplayProfileFragment.REQUEST_PICK_IMAGE);
}
public void captureImage() {
Uri captureImageUri = null;
try {
captureImageUri = Uri.fromFile(ImageStorageUtils.createImageFile(
mContext.get(),
getActivity().getResources().getString(R.string.ApptTitle),
"avatar_" + mUser.getLogin()));
} catch (IOException e) {
e.printStackTrace();
}
// Create an intent that will start an Activity to get
// capture an image.
final Intent captureImageIntent =
new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
.putExtra(MediaStore.EXTRA_OUTPUT, captureImageUri);
// Verify the intent will resolve to an Activity.
if (captureImageIntent.resolveActivity(getActivity().getPackageManager()) != null)
// Start an Activity to capture an image
startActivityForResult(captureImageIntent,
DisplayProfileFragment.REQUEST_CAPTURE_IMAGE);
}
评论说我需要更多描述:
当我上传文件时,我这样做:
boolean succeeded = mImpatientServiceProxy.uploadAvatar(userId, new TypedFile("image/jpg", imageFile));
当我下载时,我得到一个retrofit.client.Response对象,然后我从Response获取InputStream并使用输出流将数据写入文件。
final InputStream inputStream = response.getBody().in();
final OutputStream outputStream = new FileOutputStream(file);
IOUtils.copy(inputStream, outputStream);
这不是现有解决方案的重复,因为用户可以从图库上传,您不知道它是从在线资源还是从相机拍摄的照片,因此您无法在显示时旋转图像。
答案 0 :(得分:0)
使用相机api而不是意图。使用意图捕获图像时,它会显示为旋转状态。在相机api中,您可以通过这些方法更改相机的旋转以及拍摄的照片。