summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYorke Lee <yorkelee@google.com>2014-10-20 17:09:45 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-10-20 17:09:46 +0000
commit059c4ca91db79d64d1d7f831991d40575bd4fb52 (patch)
tree315c40bec615c88c02f459a91f4df52bfc11fab8 /src
parent03a215b01dff71cc189af4770d6726d42db84d01 (diff)
parent377ee9b6bd3429e790bdcf3f84f05ace234b5e8d (diff)
downloadandroid_packages_apps_ContactsCommon-059c4ca91db79d64d1d7f831991d40575bd4fb52.tar.gz
android_packages_apps_ContactsCommon-059c4ca91db79d64d1d7f831991d40575bd4fb52.tar.bz2
android_packages_apps_ContactsCommon-059c4ca91db79d64d1d7f831991d40575bd4fb52.zip
Merge "Add method to BitmapUtil to return cropped + round photos" into lmp-mr1-dev
Diffstat (limited to 'src')
-rw-r--r--src/com/android/contacts/common/util/BitmapUtil.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/com/android/contacts/common/util/BitmapUtil.java b/src/com/android/contacts/common/util/BitmapUtil.java
index a70831ec..66ab00f5 100644
--- a/src/com/android/contacts/common/util/BitmapUtil.java
+++ b/src/com/android/contacts/common/util/BitmapUtil.java
@@ -19,6 +19,11 @@ package com.android.contacts.common.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.BitmapDrawable;
@@ -107,4 +112,51 @@ public class BitmapUtil {
return new BitmapDrawable(resources,rotated);
}
+
+ /**
+ * Given an input bitmap, scales it to the given width/height and makes it round.
+ *
+ * @param input {@link Bitmap} to scale and crop
+ * @param targetWidth desired output width
+ * @param targetHeight desired output height
+ * @return output bitmap scaled to the target width/height and cropped to an oval. The
+ * cropping algorithm will try to fit as much of the input into the output as possible,
+ * while preserving the target width/height ratio.
+ */
+ public static Bitmap getRoundedBitmap(Bitmap input, int targetWidth, int targetHeight) {
+ if (input == null) {
+ return null;
+ }
+ final Bitmap result = Bitmap.createBitmap(targetWidth, targetHeight, input.getConfig());
+ final Canvas canvas = new Canvas(result);
+ final Paint paint = new Paint();
+ canvas.drawARGB(0, 0, 0, 0);
+ paint.setAntiAlias(true);
+ canvas.drawOval(0, 0, targetWidth, targetHeight, paint);
+
+ // Specifies that only pixels present in the destination (i.e. the drawn oval) should
+ // be overwritten with pixels from the input bitmap.
+ paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
+
+ final int inputWidth = input.getWidth();
+ final int inputHeight = input.getHeight();
+
+ // Choose the largest scale factor that will fit inside the dimensions of the
+ // input bitmap.
+ final float scaleBy = Math.min((float) inputWidth / targetWidth,
+ (float) inputHeight / targetHeight);
+
+ final int xCropAmountHalved = (int) (scaleBy * targetWidth / 2);
+ final int yCropAmountHalved = (int) (scaleBy * targetHeight / 2);
+
+ final Rect src = new Rect(
+ inputWidth / 2 - xCropAmountHalved,
+ inputHeight / 2 - yCropAmountHalved,
+ inputWidth / 2 + xCropAmountHalved,
+ inputHeight / 2 + yCropAmountHalved);
+
+ final RectF dst = new RectF(0, 0, targetWidth, targetHeight);
+ canvas.drawBitmap(input, src, dst, paint);
+ return result;
+ }
}