package com.amlogic.tzr.charismatic_yichang.Tool; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.net.Uri; import android.provider.MediaStore; import android.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date; /** * Created by Administrator on 2015/7/18. */ public class BitmapUtil { private static final String TAG = "BitmapUtil"; public static Bitmap transform(Bitmap source) { int STROKE_WIDTH = 6; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size); if (squaredBitmap != source) { source.recycle(); } Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint avatarPaint = new Paint(); BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); avatarPaint.setShader(shader); Paint outlinePaint = new Paint(); outlinePaint.setColor(Color.WHITE); outlinePaint.setStyle(Paint.Style.STROKE); outlinePaint.setStrokeWidth(STROKE_WIDTH); outlinePaint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, avatarPaint); canvas.drawCircle(r, r, r - STROKE_WIDTH / 2, outlinePaint); squaredBitmap.recycle(); return bitmap; } public static String saveBitmap(Bitmap mBitmap, Context mContext) { FileOutputStream out = null; String dateTime = new Date(System.currentTimeMillis()).getTime() + ""; String file_path = CacheUtils.getExternalCacheDir(mContext, "icon_") + dateTime + ".jpg"; File f = new File(file_path); if (f.exists()) { f.delete(); } try { out = new FileOutputStream(f); mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.e(TAG, "saveBitmap is ok"); return f.getAbsolutePath(); } /** * Try to return the absolute file path from the given Uri * * @param context * @param uri * @return the file path or null */ public static String getRealFilePath(final Context context, final Uri uri) { if (null == uri) return null; final String scheme = uri.getScheme(); String data = null; if (scheme == null) data = uri.getPath(); else if (ContentResolver.SCHEME_FILE.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null); if (null != cursor) { if (cursor.moveToFirst()) { int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data; } public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的高度和宽度 final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // 计算出实际宽高和目标宽高的比率 final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高 // 一定都会大于等于目标的宽和高。 inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } public static Bitmap decodeSampledBitmapFromResource(Context mContext, Uri mUri,int reqWidth, int reqHeight) throws FileNotFoundException { // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(mUri), null , options); // 调用上面定义的方法计算inSampleSize值 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); LogManager.e(TAG," options.inSampleSize ="+ options.inSampleSize); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; return BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(mUri), null, options); } /** * 通过资源id转化成Bitmap * * @param context * @param resId * @return */ public static Bitmap ReadBitmapById(Context context, int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt); } /** * 缩放Bitmap满屏 * * @param bitmap * @param screenWidth * @param screenHight * @return */ public static Bitmap getBitmap(Bitmap bitmap, int screenWidth, int screenHight) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scale = (float) screenWidth / w; float scale2 = (float) screenHight / h; // scale = scale < scale2 ? scale : scale2; matrix.postScale(scale, scale); Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); if (bitmap != null && !bitmap.equals(bmp) && !bitmap.isRecycled()) { bitmap.recycle(); bitmap = null; } return bmp;// Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); } /** * 按最大边按一定大小缩放图片 */ public static Bitmap scaleImage(byte[] buffer, float size) { // 获取原图宽度 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inPurgeable = true; options.inInputShareable = true; Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options); // 计算缩放比例 float reSize = options.outWidth / size; if (options.outWidth < options.outHeight) { reSize = options.outHeight / size; } // 如果是小图则放大 if (reSize <= 1) { int newWidth = 0; int newHeight = 0; if (options.outWidth > options.outHeight) { newWidth = (int) size; newHeight = options.outHeight * (int) size / options.outWidth; } else { newHeight = (int) size; newWidth = options.outWidth * (int) size / options.outHeight; } bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length); bm = scaleImage(bm, newWidth, newHeight); if (bm == null) { Log.e(TAG, "convertToThumb, decode fail:" + null); return null; } return bm; } // 缩放 options.inJustDecodeBounds = false; options.inSampleSize = (int) reSize; bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options); if (bm == null) { Log.e(TAG, "convertToThumb, decode fail:" + null); return null; } return bm; } /** * 检查图片是否超过一定值,是则缩小 */ public static Bitmap convertToThumb(byte[] buffer, float size) { // 获取原图宽度 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inPurgeable = true; options.inInputShareable = true; Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options); // 计算缩放比例 float reSize = options.outWidth / size; if (options.outWidth > options.outHeight) { reSize = options.outHeight / size; } if (reSize <= 0) { reSize = 1; } Log.d(TAG, "convertToThumb, reSize:" + reSize); // 缩放 options.inJustDecodeBounds = false; options.inSampleSize = (int) reSize; if (bm != null && !bm.isRecycled()) { bm.recycle(); bm = null; Log.e(TAG, "convertToThumb, recyle"); } bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options); if (bm == null) { Log.e(TAG, "convertToThumb, decode fail:" + null); return null; } return bm; } /** * Bitmap --> byte[] * * @param bmp * @return */ private static byte[] readBitmap(Bitmap bmp) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 60, baos); try { baos.flush(); baos.close(); } catch (IOException e) { e.printStackTrace(); } return baos.toByteArray(); } /** * Bitmap --> byte[] * * @param * @return */ public static byte[] readBitmapFromBuffer(byte[] buffer, float size) { return readBitmap(convertToThumb(buffer, size)); } /** * 以屏幕宽度为基准,显示图片 * * @return */ public static Bitmap decodeStream(Context context, Intent data, float size) { Bitmap image = null; try { Uri dataUri = data.getData(); // 获取原图宽度 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inPurgeable = true; options.inInputShareable = true; BitmapFactory.decodeStream(context.getContentResolver() .openInputStream(dataUri), null, options); // 计算缩放比例 float reSize = (int) (options.outWidth / size); if (reSize <= 0) { reSize = 1; } Log.d(TAG, "old-w:" + options.outWidth + ", llyt-w:" + size + ", resize:" + reSize); // 缩放 options.inJustDecodeBounds = false; options.inSampleSize = (int) reSize; image = BitmapFactory.decodeStream(context.getContentResolver() .openInputStream(dataUri), null, options); } catch (Exception e) { e.printStackTrace(); } return image; } /** * 按新的宽高缩放图片 * * @param bm * @param newWidth * @param newHeight * @return */ public static Bitmap scaleImage(Bitmap bm, int newWidth, int newHeight) { if (bm == null) { return null; } int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); if (bm != null & !bm.isRecycled()) { bm.recycle(); bm = null; } return newbm; } /** * fuction: 设置固定的宽度,高度随之变化,使图片不会变形 * * @param target 需要转化bitmap参数 * @param newWidth 设置新的宽度 * @return */ public static Bitmap fitBitmap(Bitmap target, int newWidth) { int width = target.getWidth(); int height = target.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) newWidth) / width; // float scaleHeight = ((float)newHeight) / height; int newHeight = (int) (scaleWidth * height); matrix.postScale(scaleWidth, scaleWidth); // Bitmap result = Bitmap.createBitmap(target,0,0,width,height, // matrix,true); Bitmap bmp = Bitmap.createBitmap(target, 0, 0, width, height, matrix, true); if (target != null && !target.equals(bmp) && !target.isRecycled()) { target.recycle(); target = null; } return bmp;// Bitmap.createBitmap(target, 0, 0, width, height, matrix, // true); } /** * 根据指定的宽度平铺图像 * * @param width * @param src * @return */ public static Bitmap createRepeater(int width, Bitmap src) { int count = (width + src.getWidth() - 1) / src.getWidth(); Bitmap bitmap = Bitmap.createBitmap(width, src.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); for (int idx = 0; idx < count; ++idx) { canvas.drawBitmap(src, idx * src.getWidth(), 0, null); } return bitmap; } /** * 图片的质量压缩方法 * * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 LogManager.e(TAG, "原图大小===" + baos.toByteArray().length); int options = 90; while ((baos.toByteArray().length )> 100*1024){ // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 LogManager.e(TAG, "(baos.toByteArray().length==="+baos.toByteArray().length ); LogManager.e(TAG, "image.compress(Bitmap.CompressFormat.JPEG, options, baos)----options==" + options); baos.reset();// 重置baos即清空baos options -= 10;// 每次都减少10 image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中 } LogManager.e(TAG, "压缩后的图片大小===" + baos.toByteArray().length); ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片 if (baos != null) { try { baos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (isBm != null) { try { isBm.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (image != null && !image.isRecycled()) { image.recycle(); image = null; } return bitmap; } /** * 图片按比例大小压缩方法(根据Bitmap图片压缩) * * @param image * @return */ public static Bitmap getImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); if (baos.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 baos.reset();// 重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 这里压缩50%,把压缩后的数据存放到baos中 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); BitmapFactory.Options newOpts = new BitmapFactory.Options(); // 开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; // 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;// 这里设置高度为800f float ww = 480f;// 这里设置宽度为480f // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;// be=1表示不缩放 if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放 be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;// 设置缩放比例 // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 isBm = new ByteArrayInputStream(baos.toByteArray()); bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); if (isBm != null) { try { isBm.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (image != null && !image.isRecycled()) { image.recycle(); image = null; } return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩 } /** * 通过资源id转化成Bitmap 全屏显示 * * @param context * @param drawableId * @param screenWidth * @param screenHight * @return */ public static Bitmap ReadBitmapById(Context context, int drawableId, int screenWidth, int screenHight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; options.inInputShareable = true; options.inPurgeable = true; InputStream stream = context.getResources().openRawResource(drawableId); Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options); return getBitmap(bitmap, screenWidth, screenHight); } public static Bitmap decodeUriAsBitmap(Context context, Uri uri) { Bitmap mBitmapbitmap = null; try { mBitmapbitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } return mBitmapbitmap; } }