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; } }