Last active
December 19, 2016 09:40
-
-
Save nahba/7802202 to your computer and use it in GitHub Desktop.
Image Scaling Utility Class
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private int mSourceId; | |
| private int mDstWidth; | |
| private int mDstHeight; | |
| onCreate: | |
| ======== | |
| mSourceId = R.drawable.image; | |
| mDstWidth = getResources().getDimensionPixelSize(R.dimen.destination_width); | |
| mDstHeight = getResources().getDimensionPixelSize(R.dimen.destination_height); | |
| In Function: | |
| =========== | |
| Bitmap unscaledBitmap = ScalingUtilities.decodeResource(getResources(), mSourceId, | |
| mDstWidth, mDstHeight, ScalingLogic.FIT); | |
| Bitmap scaledBitmap = ScalingUtilities.createScaledBitmap(unscaledBitmap, mDstWidth, | |
| mDstHeight, ScalingLogic.FIT); | |
| unscaledBitmap.recycle(); | |
| ImageView.setImageBitmap(scaledBitmap); | |
| OR | |
| Bitmap unscaledBitmap = ScalingUtilities.decodeResource(getResources(), mSourceId, | |
| mDstWidth, mDstHeight, ScalingLogic.CROP); | |
| Bitmap scaledBitmap = ScalingUtilities.createScaledBitmap(unscaledBitmap, mDstWidth, | |
| mDstHeight, ScalingLogic.CROP); | |
| unscaledBitmap.recycle(); | |
| ImageView.setImageBitmap(scaledBitmap); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import android.content.res.Resources; | |
| import android.graphics.Bitmap; | |
| import android.graphics.Bitmap.Config; | |
| import android.graphics.BitmapFactory; | |
| import android.graphics.BitmapFactory.Options; | |
| import android.graphics.Canvas; | |
| import android.graphics.Paint; | |
| import android.graphics.Rect; | |
| public class ScalingUtilities { | |
| public static Bitmap decodeResource(Resources res, int resId, int dstWidth, | |
| int dstHeight, ScalingLogic scalingLogic) { | |
| Options options = new Options(); | |
| options.inJustDecodeBounds = true; | |
| BitmapFactory.decodeResource(res, resId, options); | |
| options.inJustDecodeBounds = false; | |
| options.inSampleSize = calculateSampleSize(options.outWidth, | |
| options.outHeight, dstWidth, dstHeight, scalingLogic); | |
| Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, | |
| options); | |
| return unscaledBitmap; | |
| } | |
| public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, | |
| int dstWidth, int dstHeight, ScalingLogic scalingLogic) { | |
| Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), | |
| unscaledBitmap.getHeight(), dstWidth, dstHeight, scalingLogic); | |
| Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), | |
| unscaledBitmap.getHeight(), dstWidth, dstHeight, scalingLogic); | |
| Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), | |
| dstRect.height(), Config.ARGB_8888); | |
| Canvas canvas = new Canvas(scaledBitmap); | |
| canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint( | |
| Paint.FILTER_BITMAP_FLAG)); | |
| return scaledBitmap; | |
| } | |
| public static enum ScalingLogic { | |
| CROP, FIT | |
| } | |
| public static int calculateSampleSize(int srcWidth, int srcHeight, | |
| int dstWidth, int dstHeight, ScalingLogic scalingLogic) { | |
| if (scalingLogic == ScalingLogic.FIT) { | |
| final float srcAspect = (float) srcWidth / (float) srcHeight; | |
| final float dstAspect = (float) dstWidth / (float) dstHeight; | |
| if (srcAspect > dstAspect) { | |
| return srcWidth / dstWidth; | |
| } else { | |
| return srcHeight / dstHeight; | |
| } | |
| } else { | |
| final float srcAspect = (float) srcWidth / (float) srcHeight; | |
| final float dstAspect = (float) dstWidth / (float) dstHeight; | |
| if (srcAspect > dstAspect) { | |
| return srcHeight / dstHeight; | |
| } else { | |
| return srcWidth / dstWidth; | |
| } | |
| } | |
| } | |
| public static Rect calculateSrcRect(int srcWidth, int srcHeight, | |
| int dstWidth, int dstHeight, ScalingLogic scalingLogic) { | |
| if (scalingLogic == ScalingLogic.CROP) { | |
| final float srcAspect = (float) srcWidth / (float) srcHeight; | |
| final float dstAspect = (float) dstWidth / (float) dstHeight; | |
| if (srcAspect > dstAspect) { | |
| final int srcRectWidth = (int) (srcHeight * dstAspect); | |
| final int srcRectLeft = (srcWidth - srcRectWidth) / 2; | |
| return new Rect(srcRectLeft, 0, srcRectLeft + srcRectWidth, | |
| srcHeight); | |
| } else { | |
| final int srcRectHeight = (int) (srcWidth / dstAspect); | |
| final int scrRectTop = (int) (srcHeight - srcRectHeight) / 2; | |
| return new Rect(0, scrRectTop, srcWidth, scrRectTop | |
| + srcRectHeight); | |
| } | |
| } else { | |
| return new Rect(0, 0, srcWidth, srcHeight); | |
| } | |
| } | |
| public static Rect calculateDstRect(int srcWidth, int srcHeight, | |
| int dstWidth, int dstHeight, ScalingLogic scalingLogic) { | |
| if (scalingLogic == ScalingLogic.FIT) { | |
| final float srcAspect = (float) srcWidth / (float) srcHeight; | |
| final float dstAspect = (float) dstWidth / (float) dstHeight; | |
| if (srcAspect > dstAspect) { | |
| return new Rect(0, 0, dstWidth, (int) (dstWidth / srcAspect)); | |
| } else { | |
| return new Rect(0, 0, (int) (dstHeight * srcAspect), dstHeight); | |
| } | |
| } else { | |
| return new Rect(0, 0, dstWidth, dstHeight); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment