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