package com.devsmart.android; import java.io.FileDescriptor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Matrix.ScaleToFit; public class GraphicsUtils { public static enum ScaleType { CENTER_CROP, CENTER_FIT } public static Matrix createScaleRect(RectF src, RectF dest, ScaleType type){ Matrix retval = new Matrix(); switch(type){ case CENTER_CROP: float[] points = new float[8]; points[0] = src.left; points[1] = src.top; points[2] = src.right; points[3] = src.bottom; points[4] = dest.left; points[5] = dest.top; points[6] = dest.right; points[7] = dest.bottom; final float ratioSrc = src.width() / src.height(); final float ratioDest = dest.width() / dest.height(); if(ratioSrc > ratioDest){ float fwidth = ratioSrc * dest.height(); points[4] = dest.left - (fwidth - dest.width()) / 2; points[6] = dest.right + (fwidth - dest.width()) / 2; } else { float fheight = dest.width() / ratioSrc; points[5] = dest.top - (fheight - dest.height()) / 2; points[7] = dest.bottom + (fheight - dest.height()) / 2; } retval.setPolyToPoly(points, 0, points, 4, 2); break; case CENTER_FIT: retval.setRectToRect(src, dest, ScaleToFit.CENTER); } return retval; } public static Bitmap rotateBitmap(Bitmap input, int degrees) { RectF srcRect = new RectF(0, 0, input.getWidth(), input.getHeight()); Matrix matrix = new Matrix(); matrix.setRotate(degrees); matrix.mapRect(srcRect); matrix.postTranslate(0 - srcRect.left, 0 - srcRect.top); Bitmap targetBitmap = Bitmap.createBitmap(Math.round(srcRect.width()), Math.round(srcRect.height()), Bitmap.Config.RGB_565); Canvas canvas = new Canvas(targetBitmap); canvas.drawBitmap(input, matrix, new Paint()); return targetBitmap; } public static Bitmap downsampleBitmap(FileDescriptor fd, int maxArea) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; Rect outRect = new Rect(); BitmapFactory.decodeFileDescriptor(fd, outRect, opts); int subsample = 1; int width = opts.outWidth; int height = opts.outHeight; while(width * height > maxArea) { width /= 2; height /= 2; subsample++; } opts.inJustDecodeBounds = false; opts.inSampleSize = subsample; Bitmap retval = BitmapFactory.decodeFileDescriptor(fd, null, opts); return retval; } }