diff --git a/example/src/main/AndroidManifest.xml b/example/src/main/AndroidManifest.xml index 7428cc23..e0617add 100644 --- a/example/src/main/AndroidManifest.xml +++ b/example/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ - + + + + + \ No newline at end of file diff --git a/example/src/main/res/values/strings.xml b/example/src/main/res/values/strings.xml index 7a257821..ea8c8b3c 100644 --- a/example/src/main/res/values/strings.xml +++ b/example/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Crop Demo - Pick + PickFromAlumb + PickFromCamera diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 1cb31d04..59fc3130 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -34,6 +34,7 @@ import android.view.Window; import android.view.WindowManager; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -288,6 +289,12 @@ private void onSaveClicked() { } } + if(exifRotation != 0 && exifRotation % 90 == 0){ + int tmp = outWidth; + outWidth = outHeight; + outHeight = tmp; + } + try { croppedImage = decodeRegionCrop(r, outWidth, outHeight); } catch (IllegalArgumentException e) { @@ -380,17 +387,27 @@ private void clearImageView() { private void saveOutput(Bitmap croppedImage) { if (saveUri != null) { OutputStream outputStream = null; + + Bitmap destBitmap = croppedImage; + if(exifRotation != 0){ + destBitmap = CropUtil.rotateImage(croppedImage, exifRotation); + } + FileInputStream inputStream = null; try { + //save bitmap to file outputStream = getContentResolver().openOutputStream(saveUri); if (outputStream != null) { - croppedImage.compress(saveAsPng ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, + destBitmap.compress(saveAsPng ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, 90, // note: quality is ignored when using PNG outputStream); } - } catch (IOException e) { + destBitmap.recycle(); + } catch (OutOfMemoryError error) { + } catch (IOException e){ setResultException(e); Log.e("Cannot open file: " + saveUri, e); - } finally { + }finally { + CropUtil.closeSilently(inputStream); CropUtil.closeSilently(outputStream); } diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropUtil.java b/lib/src/main/java/com/soundcloud/android/crop/CropUtil.java index 04e83224..3537dea7 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropUtil.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropUtil.java @@ -20,6 +20,8 @@ import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.Matrix; import android.media.ExifInterface; import android.net.Uri; import android.os.Handler; @@ -158,7 +160,7 @@ private static File getFromMediaUriPfd(Context context, ContentResolver resolver } public static void startBackgroundJob(MonitoredActivity activity, - String title, String message, Runnable job, Handler handler) { + String title, String message, Runnable job, Handler handler) { // Make the progress dialog uncancelable, so that we can guarantee // the thread will be done before the activity getting destroyed ProgressDialog dialog = ProgressDialog.show( @@ -215,4 +217,13 @@ public void onActivityStarted(MonitoredActivity activity) { } } + public static Bitmap rotateImage(Bitmap img, int rotate) { + Matrix matrix = new Matrix(); + matrix.postRotate(rotate); + int width = img.getWidth(); + int height = img.getHeight(); + img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, false); + return img; + } + }