2016-09-15 48 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对象并执行相同操作? File photo = new File(PATH_TO_FILE); 您还可以注意到,我没有使用任何其他文件参考而不是** file.getPath()**,因此您可以将** imageFile.getPath()**的每次出现替换为** your_path **。应该很简单:) – Rybzor

+0

您能否让我知道您使用什么类型的连接将映像上传到服务器? – Esteban