package it.sephiroth.android.library.imagezoom.test.utils; import android.graphics.Bitmap; import android.graphics.Matrix; /** * Various bitmap utilities * * @author alessandro */ public class BitmapUtils { /** * Resize a bitmap * * @param input * @param destWidth * @param destHeight * @return * @throws OutOfMemoryError */ public static Bitmap resizeBitmap(final Bitmap input, int destWidth, int destHeight) throws OutOfMemoryError { return resizeBitmap(input, destWidth, destHeight, 0); } /** * Resize a bitmap object to fit the passed width and height * * @param input The bitmap to be resized * @param destWidth Desired maximum width of the result bitmap * @param destHeight Desired maximum height of the result bitmap * @return A new resized bitmap * @throws OutOfMemoryError if the operation exceeds the available vm memory */ public static Bitmap resizeBitmap(final Bitmap input, int destWidth, int destHeight, int rotation) throws OutOfMemoryError { int dstWidth = destWidth; int dstHeight = destHeight; final int srcWidth = input.getWidth(); final int srcHeight = input.getHeight(); if (rotation == 90 || rotation == 270) { dstWidth = destHeight; dstHeight = destWidth; } boolean needsResize = false; float p; if ((srcWidth > dstWidth) || (srcHeight > dstHeight)) { needsResize = true; if ((srcWidth > srcHeight) && (srcWidth > dstWidth)) { p = (float) dstWidth / (float) srcWidth; dstHeight = (int) (srcHeight * p); } else { p = (float) dstHeight / (float) srcHeight; dstWidth = (int) (srcWidth * p); } } else { dstWidth = srcWidth; dstHeight = srcHeight; } if (needsResize || rotation != 0) { Bitmap output; if (rotation == 0) { output = Bitmap.createScaledBitmap(input, dstWidth, dstHeight, true); } else { Matrix matrix = new Matrix(); matrix.postScale((float) dstWidth / srcWidth, (float) dstHeight / srcHeight); matrix.postRotate(rotation); output = Bitmap.createBitmap(input, 0, 0, srcWidth, srcHeight, matrix, true); } return output; } else return input; } }