package com.yuyh.library.utils.io;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.view.View;
import com.yuyh.library.utils.data.safe.Base64;
import com.yuyh.library.utils.log.LogUtils;
import com.yuyh.library.utils.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* @author yuyh.
* @date 16/4/9.
*/
public class BitmapUtils {
private static final String TAG = BitmapUtils.class.getSimpleName();
/**
* Bitmap 转 Bytes
*
* @param b
* @return
*/
public static byte[] bitmapToByte(Bitmap b) {
ByteArrayOutputStream o = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, o);
return o.toByteArray();
}
/**
* Bytes 转 Bitmap
*
* @param b
* @return
*/
public static Bitmap byteToBitmap(byte[] b) {
return (b == null || b.length == 0) ? null : BitmapFactory.decodeByteArray(b, 0, b.length);
}
/**
* Bitmap转换成Base64编码的String
*
* @param bitmap
* @return
*/
public static String bitmapToString(Bitmap bitmap) {
return Base64.encodeToString(bitmapToByte(bitmap), Base64.DEFAULT);
}
/**
* string2Bitmap
*
* @param str
* @return
*/
public static Bitmap stringToBitmap(String str) throws Exception {
if (StringUtils.isEmpty(str)) return null;
byte[] bitmapArray = Base64.decode(str, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
}
/**
* Drawable 转 Bitmap
*
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
return drawable == null ? null : ((BitmapDrawable) drawable).getBitmap();
}
/**
* BitMap 转 Drawable
*
* @param bitmap
* @return
*/
public static Drawable bitmapToDrawable(Bitmap bitmap) {
return bitmap == null ? null : new BitmapDrawable(bitmap);
}
/**
* 获取View的截图
*
* @param view
* @return
*/
public static Bitmap viewToBitmap(View view) {
if (view == null) return null;
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable = view.getBackground();
if (bgDrawable != null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
view.draw(canvas);
return returnedBitmap;
}
/**
* 屏幕截图
*
* @param activity
* @return
*/
public static Bitmap viewToBitmap(Activity activity) {
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
View view = activity.getWindow().getDecorView();
view.layout(0, 0, dm.widthPixels, dm.heightPixels);
view.setDrawingCacheEnabled(true);
return Bitmap.createBitmap(view.getDrawingCache());
}
/**
* 图片缩放
*
* @param org 原始图片
* @param newWidth 缩放后的宽度
* @param newHeight 缩放后的高
* @return
*/
public static Bitmap scaleImageTo(Bitmap org, int newWidth, int newHeight) {
return scaleImage(org, (float) newWidth / org.getWidth(), (float) newHeight / org.getHeight());
}
/**
* 图片缩放
*
* @param org 原始图片
* @param scaleWidth 宽度缩放倍数
* @param scaleHeight 高度缩放倍数
* @return
*/
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);
}
/**
* 获取圆形图片
*
* @param bitmap
* @return
*/
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;
}
/**
* 生成缩略图
*
* @param bitMap
* @param needRecycle 原图是否销毁
* @param newHeight
* @param newWidth
* @return
*/
public static Bitmap getBitmapThumbnail(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;
}
/**
* 保存BitMap成文件
*
* @param bitmap
* @param file
* @return
*/
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;
}
/**
* 保存Bitmap到文件
*
* @param bitmap
* @param absPath 文件绝对路径
* @return
*/
public static boolean saveBitmap(Bitmap bitmap, String absPath) {
return saveBitmap(bitmap, new File(absPath));
}
/**
* 反射 得到本地视频的预览图
*
* @param context
* @param uri
* @return
*/
public static Bitmap createVideoThumbnail(Context context, Uri uri) {
Bitmap bitmap = null;
String className = "android.media.MediaMetadataRetriever";
Object objectMediaMetadataRetriever = null;
Method release = null;
try {
objectMediaMetadataRetriever = Class.forName(className).newInstance();
Method setDataSourceMethod = Class.forName(className).getMethod("setDataSource", Context.class, Uri.class);
setDataSourceMethod.invoke(objectMediaMetadataRetriever, context, uri);
Method getFrameAtTimeMethod = Class.forName(className).getMethod("getFrameAtTime");
bitmap = (Bitmap) getFrameAtTimeMethod.invoke(objectMediaMetadataRetriever);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (release != null) {
release.invoke(objectMediaMetadataRetriever);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return bitmap;
}
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) {
LogUtils.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 byte[] compressBitmapToBytes(String filePath, int reqWidth, int reqHeight, int quality) {
Bitmap bitmap = getSmallBitmap(filePath, reqWidth, reqHeight);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
byte[] bytes = baos.toByteArray();
bitmap.recycle();
LogUtils.i(TAG, "Bitmap compressed success, size: " + bytes.length);
return bytes;
}
public byte[] compressBitmapSmallTo(String filePath, int reqWidth, int reqHeight, int maxLenth) {
int quality = 100;
byte[] bytes = compressBitmapToBytes(filePath, reqWidth, reqHeight, quality);
while (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);
}
}