@SuppressWarnings({"WeakerAccess","unused"})
public class BitmapUtil {
private static final StringTAG = BitmapUtil.class.getSimpleName();
/**
* convert Bitmap to byte array
*/
public static byte[] bitmapToByte(Bitmap b) {
ByteArrayOutputStream o =new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG,100, o);
return o.toByteArray();
}
/**
* convert byte array to Bitmap
*/
public static Bitmap byteToBitmap(byte[] b) {
return (b ==null || b.length ==0) ?null : BitmapFactory.decodeByteArray(b,0, b.length);
}
/**
* 把bitmap转换成Base64编码String
*/
public static String bitmapToString(Bitmap bitmap) {
return Base64.encodeToString(bitmapToByte(bitmap), Base64.DEFAULT);
}
/**
* convert Drawable to Bitmap
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
return drawable ==null ?null : ((BitmapDrawable) drawable).getBitmap();
}
/**
* convert Bitmap to Drawable
*/
public static Drawable bitmapToDrawable(Bitmap bitmap) {
return bitmap ==null ?null :new BitmapDrawable(bitmap);
}
/**
* scale image
*/
public static Bitmap scaleImageTo(Bitmap org,int newWidth,int newHeight) {
return scaleImage(org, (float) newWidth / org.getWidth(), (float) newHeight / org.getHeight());
}
/**
* scale image
*/
public static Bitmap scaleImage(Bitmap org,float scaleWidth,float scaleHeight) {
if (org ==null) {
return null;
}
Matrix matrix =new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
return Bitmap.createBitmap(org,0,0, org.getWidth(), org.getHeight(), matrix,true);
}
public static Bitmap toRoundCorner(Bitmap bitmap) {
int height = bitmap.getHeight();
int width = bitmap.getHeight();
Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas =new Canvas(output);
final Paint paint =new Paint();
final Rect rect =new Rect(0,0, width, height);
paint.setAntiAlias(true);
canvas.drawARGB(0,0,0,0);
// paint.setColor(0xff424242);
paint.setColor(Color.TRANSPARENT);
canvas.drawCircle(width /2, height /2, width /2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
public static Bitmap createBitmapThumbnail(Bitmap bitMap,boolean needRecycle,int newHeight,int newWidth) {
int width = bitMap.getWidth();
int height = bitMap.getHeight();
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 取得想要缩放的matrix参数
Matrix matrix =new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap newBitMap = Bitmap.createBitmap(bitMap,0,0, width, height, matrix,true);
if (needRecycle)
bitMap.recycle();
return newBitMap;
}
public static boolean saveBitmap(Bitmap bitmap, File file) {
if (bitmap ==null)
return false;
FileOutputStream fos =null;
try {
fos =new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,100, fos);
fos.flush();
return true;
}catch (Exception e) {
e.printStackTrace();
}finally {
if (fos !=null) {
try {
fos.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
return false;
}
public static boolean saveBitmap(Bitmap bitmap, String absPath) {
return saveBitmap(bitmap,new File(absPath));
}
public static Intent buildImageGetIntent(Uri saveTo,int outputX,int outputY,boolean returnData) {
return buildImageGetIntent(saveTo,1,1, outputX, outputY, returnData);
}
public static Intent buildImageGetIntent(Uri saveTo,int aspectX,int aspectY,int outputX,int outputY,
boolean returnData) {
Log.i(TAG,"Build.VERSION.SDK_INT : " + Build.VERSION.SDK_INT);
Intent intent =new Intent();
if (Build.VERSION.SDK_INT <19) {
intent.setAction(Intent.ACTION_GET_CONTENT);
}else {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
}
intent.setType("image/*");
intent.putExtra("output", saveTo);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale",true);
intent.putExtra("return-data", returnData);
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
return intent;
}
public static Intent buildImageCropIntent(Uri uriFrom, Uri uriTo,int outputX,int outputY,boolean returnData) {
return buildImageCropIntent(uriFrom, uriTo,1,1, outputX, outputY, returnData);
}
public static Intent buildImageCropIntent(Uri uriFrom, Uri uriTo,int aspectX,int aspectY,int outputX,
int outputY,boolean returnData) {
Intent intent =new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uriFrom,"image/*");
intent.putExtra("crop","true");
intent.putExtra("output", uriTo);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale",true);
intent.putExtra("return-data", returnData);
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
return intent;
}
public static Intent buildImageCaptureIntent(Uri uri) {
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
return intent;
}
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight) {
int h = options.outHeight;
int w = options.outWidth;
int inSampleSize =0;
if (h > reqHeight || w > reqWidth) {
float ratioW = (float) w / reqWidth;
float ratioH = (float) h / reqHeight;
inSampleSize = (int) Math.min(ratioH, ratioW);
}
inSampleSize = Math.max(1, inSampleSize);
return inSampleSize;
}
public static Bitmap getSmallBitmap(String filePath,int reqWidth,int reqHeight) {
BitmapFactory.Options options =new BitmapFactory.Options();
options.inJustDecodeBounds =true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize =calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds =false;
return BitmapFactory.decodeFile(filePath, options);
}
public static byte[] compressBitmapToBytes(String filePath,int reqWidth,int reqHeight,int quality) {
Logs.i("ImageTest","02-start getSmallBitmap : " + System.currentTimeMillis());
Bitmap bitmap =getSmallBitmap(filePath, reqWidth, reqHeight);
Logs.i("ImageTest","03-start rotateBitmapByDegree : " + System.currentTimeMillis());
//根据图片的角度信息,旋转图片。否则,在三星手机上,拍照的图片,是横的
int imgDegree =getPictureDegree(filePath);
if (imgDegree !=0) {
bitmap =rotateBitmapByDegree(bitmap, imgDegree);
}
Logs.i("ImageTest","04-start compress : " + System.currentTimeMillis());
if (null != bitmap) {
final ByteArrayOutputStream baos =new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
Logs.i("ImageTest","05-end compress : " + System.currentTimeMillis());
byte[] bytes = baos.toByteArray();
Logs.i("ImageTest","06-start recycle : " + System.currentTimeMillis());
if (!bitmap.isRecycled()) {
bitmap.recycle();
}
try {
baos.close();
}catch (IOException e) {
e.printStackTrace();
}
Logs.i("ImageTest","07-end recycle : " + System.currentTimeMillis());
return bytes;
}
return null;
}
public byte[] compressBitmapSmallTo(String filePath,int reqWidth,int reqHeight,int maxLenth) {
int quality =100;
byte[] bytes =compressBitmapToBytes(filePath, reqWidth, reqHeight, quality);
while (null != bytes && bytes.length > maxLenth && quality >0) {
quality = quality /2;
bytes =compressBitmapToBytes(filePath, reqWidth, reqHeight, quality);
}
return bytes;
}
public byte[] compressBitmapQuikly(String filePath) {
return compressBitmapToBytes(filePath,480,800,50);
}
public byte[] compressBitmapQuiklySmallTo(String filePath,int maxLenth) {
return compressBitmapSmallTo(filePath,480,800, maxLenth);
}
/**
* 读取图片属性:旋转的角度
* @param path 图片绝对路径
* @return degree旋转的角度
* @author yangrui09
*/
public static int getPictureDegree(String path) {
if (TextUtils.isEmpty(path))
return 0;
int degree =0;
try {
ExifInterface exifInterface =new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree =90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree =180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree =270;
break;
}
}catch (Exception e) {
e.printStackTrace();
}
return degree;
}
/**
* 将图片按照某个角度进行旋转
*
* @param bm 需要旋转的图片
* @param degree 旋转角度
* @return 旋转后的图片
*/
public static Bitmap rotateBitmapByDegree(Bitmap bm,int degree) {
if (null == bm) {
return null;
}
Bitmap returnBm =null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix =new Matrix();
matrix.postRotate(degree);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bm,0,0, bm.getWidth(), bm.getHeight(), matrix,true);
}catch (OutOfMemoryError e) {
}
if (returnBm ==null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}
}
网友评论