2016-09-15 22 views
1

写真を撮ったり、ギャラリーから写真を選択して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); 
} 
+2

これが重複している:http://stackoverflow.com/questions/39469145/capture-image-rotate-after-upload/39469225#39469225 –

答えて

1

私は数週間前に同じ問題に直面していました。私はいくつかの掘り出しを作った、これは私がいつも正しい方向にアップロードされた写真を持っていたものです。すべてのデバイスで毎回動作します。それが役に立てば幸い。

//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); 
} 
+0

後半の答えのために申し訳ありませんが、あなたはファイルでそれを行います議論として私は道でそれをしている間、議論として。パスでコードを実装するにはどうすればよいですか? – Esteban

+0

Fileオブジェクトをパスから取得して同じ処理を行うだけですか?ファイルphoto =新しいファイル(PATH_TO_FILE); ** file.getPath()**以外のファイルを使用していないことに気付くことができるので、** imageFile.getPath()**のすべての存在を** your_path **に置き換えることができます。本当にシンプルでなければなりません: – Rybzor

+0

イメージをサーバーにアップロードするために使用する接続のタイプを教えてください。 – Esteban

関連する問題