存储在服务器中的Android图像在检索时轮换

时间:2015-11-02 15:32:47

标签: android image rotation android-camera

在我的代码中,我允许用户从图库或相机上传照片。然后通过改造将图像存储到服务器中。如果使用手机的相机拍摄照片(无论是通过应用程序调用还是直接通过相机调用),检索时照片总是旋转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);
}

更新1

评论说我需要更多描述:

当我上传文件时,我这样做:

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);

更新2

这不是现有解决方案的重复,因为用户可以从图库上传,您不知道它是从在线资源还是从相机拍摄的照片,因此您无法在显示时旋转图像。

1 个答案:

答案 0 :(得分:0)

使用相机api而不是意图。使用意图捕获图像时,它会显示为旋转状态。在相机api中,您可以通过这些方法更改相机的旋转以及拍摄的照片。