package im.actor.sdk.util.images.ops; import android.graphics.*; import im.actor.sdk.util.images.common.WorkCache; import static im.actor.sdk.util.images.ops.ImageDrawing.*; /** * Scaling images effectively with keeping good quality. * * @author Stepan ex3ndr Korshakov me@ex3ndr.com */ public class ImageScaling { /** * Scaling bitmap to fill rect with centering. Method keep aspect ratio. * * @param src source bitmap * @param w width of result * @param h height of result * @return scaled bitmap */ public static Bitmap scaleFill(Bitmap src, int w, int h) { Bitmap res = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); scaleFill(src, res); return res; } /** * Scaling src bitmap to fill dest bitmap with centering. Method keep aspect ratio. * * @param src source bitmap * @param dest destination bitmap */ public static void scaleFill(Bitmap src, Bitmap dest) { scaleFill(src, dest, CLEAR_COLOR); } /** * Scaling src bitmap to fill dest bitmap with centering. Method keep aspect ratio. * * @param src source bitmap * @param dest destination bitmap * @param clearColor color for clearing dest before drawing */ public static void scaleFill(Bitmap src, Bitmap dest, int clearColor) { float ratio = Math.max(dest.getWidth() / (float) src.getWidth(), dest.getHeight() / (float) src.getHeight()); int newW = (int) (src.getWidth() * ratio); int newH = (int) (src.getHeight() * ratio); int paddingTop = (dest.getHeight() - (int) (src.getHeight() * ratio)) / 2; int paddingLeft = (dest.getWidth() - (int) (src.getWidth() * ratio)) / 2; scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), paddingLeft, paddingTop, newW + paddingLeft, newH + paddingTop); } /** * Scaling bitmap to fit required sizes. Method keep aspect ratio. * * @param src source bitmap * @param maxW maximum width of result bitmap * @param maxH maximum height of result bitmap * @return scaled bitmap */ public static Bitmap scaleFit(Bitmap src, int maxW, int maxH) { float ratio = Math.min(maxW / (float) src.getWidth(), maxH / (float) src.getHeight()); int newW = (int) (src.getWidth() * ratio); int newH = (int) (src.getHeight() * ratio); return scale(src, newW, newH); } /** * Scaling src Bitmap to fit and cenetered in dest bitmap. Method keep aspect ratio. * * @param src source bitmap * @param dest destination bitmap */ public static void scaleFit(Bitmap src, Bitmap dest) { scaleFit(src, dest, CLEAR_COLOR); } /** * Scaling src Bitmap to fit and cenetered in dest bitmap. Method keep aspect ratio. * * @param src source bitmap * @param dest destination bitmap * @param clearColor color for clearing dest before drawing */ public static void scaleFit(Bitmap src, Bitmap dest, int clearColor) { float ratio = Math.min(dest.getWidth() / (float) src.getWidth(), dest.getHeight() / (float) src.getHeight()); int newW = (int) (src.getWidth() * ratio); int newH = (int) (src.getHeight() * ratio); int paddingTop = (dest.getHeight() - (int) (src.getHeight() * ratio)) / 2; int paddingLeft = (dest.getWidth() - (int) (src.getWidth() * ratio)) / 2; scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), paddingLeft, paddingTop, newW + paddingLeft, newH + paddingTop); } /** * Scaling bitmap to specific width and height without keeping aspect ratio. * * @param src source bitmap * @param dw new width * @param dh new height * @return scaled bitmap */ public static Bitmap scale(Bitmap src, int dw, int dh) { Bitmap res = Bitmap.createBitmap(dw, dh, Bitmap.Config.ARGB_8888); scale(src, res); return res; } /** * Scaling bitmap to fill dest bitmap without keeping aspect ratio. * * @param src source bitmap * @param dest destination bitmap */ public static void scale(Bitmap src, Bitmap dest) { scale(src, dest, CLEAR_COLOR); } /** * Scaling bitmap to fill dest bitmap without keeping aspect ratio. * * @param src source bitmap * @param dest destination bitmap * @param clearColor color for clearing dest before drawing */ public static void scale(Bitmap src, Bitmap dest, int clearColor) { scale(src, dest, clearColor, 0, 0, src.getWidth(), src.getHeight(), 0, 0, dest.getWidth(), dest.getHeight()); } /** * Scaling region of bitmap to destination bitmap region * * @param src source bitmap * @param dest destination bitmap * @param x source x * @param y source y * @param sw source width * @param sh source height * @param dx destination x * @param dy destination y * @param dw destination width * @param dh destination height */ public static void scale(Bitmap src, Bitmap dest, int x, int y, int sw, int sh, int dx, int dy, int dw, int dh) { scale(src, dest, CLEAR_COLOR, x, y, sw, sh, dx, dy, dw, dh); } /** * Scaling region of bitmap to destination bitmap region * * @param src source bitmap * @param dest destination bitmap * @param clearColor color for clearing dest before drawing * @param x source x * @param y source y * @param sw source width * @param sh source height * @param dx destination x * @param dy destination y * @param dw destination width * @param dh destination height */ public static void scale(Bitmap src, Bitmap dest, int clearColor, int x, int y, int sw, int sh, int dx, int dy, int dw, int dh) { clearBitmap(dest, clearColor); Canvas canvas = new Canvas(dest); Paint paint = WorkCache.PAINT.get(); paint.setFilterBitmap(true); canvas.drawBitmap(src, new Rect(x + 1, y + 1, sw - 1, sh - 1), new Rect(dx, dy, dw, dh), paint); canvas.setBitmap(null); } protected ImageScaling() { } }