package forezp.com.douyalibrary.utils; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * Bitmap 操作类 , * Created by b508a on 2015/12/28. */ public class BitmapUtils { // public static Bitmap casualStroke(Context context, int drawableId, int color) { // Bitmap mode = ((BitmapDrawable) context.getResources().getDrawable( // drawableId)).getBitmap(); // Bitmap bitmap = mode.copy(Bitmap.Config.ARGB_8888, true); // Canvas canvas = new Canvas(); // canvas.setBitmap(bitmap); // Paint paintUnder = new Paint(); // paintUnder.setColor(color); // canvas.drawPaint(paintUnder); // Paint paint = new Paint(); // paint.setFilterBitmap(true); // paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); // canvas.drawBitmap(mode, 0, 0, paint); // return bitmap; // } /** * 根据本地获取url 获取bitmap ,根据options去decode, * 像素为128*128 * @param * @return */ public static Bitmap loadBitmap(String imageFile){ BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(imageFile, opts); opts.inSampleSize = computeSampleSize(opts, -1, 128*128); opts.inJustDecodeBounds = false; Bitmap bmp = null; try { bmp = BitmapFactory.decodeFile(imageFile, opts); } catch (OutOfMemoryError e) { e.printStackTrace(); } return bmp; } /** * 根据像素和本地url加载bitmap * @param maxNumOfPixels * @param imgpath * @return */ public static Bitmap loadBitmap(int maxNumOfPixels, String imgpath) { Bitmap bitmap = null; try { FileInputStream f = new FileInputStream(new File(imgpath)); // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(imgpath, options); // 调用上面定义的方法计算inSampleSize值 if (0 == maxNumOfPixels) { maxNumOfPixels = 128 * 128; } options.inSampleSize = computeSampleSize(options, -1, maxNumOfPixels); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(f, null, options); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; } /**' * drawable 转bitmap * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap.createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } /** * 缩放bitmpap * @param bm * @param w * @param h * @return */ public static Bitmap zoomBitmap(Bitmap bm, int w, int h) { Bitmap newBitmap; if (bm == null) { return null; } float scaleWidth = bm.getWidth() * 1.0f / w; float scaleHeight = bm.getHeight() * 1.0f / h; float scale = scaleWidth > scaleHeight ? scaleWidth : scaleHeight; if (scale > 1.01) { newBitmap = Bitmap.createScaledBitmap(bm, (int) (bm.getWidth() / scale), (int) (bm.getHeight() / scale), false); } else { newBitmap = bm; } return newBitmap; } /** * 从内存卡的图片转换成bitmap * @param filePath * @return */ public static Bitmap loadFromSdCard(String filePath) { File file = new File(filePath); Bitmap bmp = null; try { FileInputStream fis = new FileInputStream(file); bmp = BitmapFactory.decodeStream(fis); if (bmp != null) { return bmp; } } catch (FileNotFoundException e) { e.printStackTrace(); } return null; } /** * * @param bm 要保存的bitmap * @param picName 保存文件的名字;默认存储在mediapath路径下。 */ public static void saveBitmap(Bitmap bm, String picName) { Log.e("", "保存图片"); try { File f = new File(FileHelper.getInstance().getMediaPath(), picName + ".JPEG"); if (f.exists()) { f.delete(); } FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); Log.e("", "已经保存"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 获取圆角bitmap * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); final float roundPx = 12; paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); if (null != bitmap) { bitmap.recycle(); bitmap = null; } return output; } /** * 转换图片成圆形 * * @param bitmap * 传入Bitmap对象 * @return */ public static Bitmap toRoundBitmap(Bitmap bitmap) { if (bitmap == null) { return null; } int width = bitmap.getWidth(); int height = bitmap.getHeight(); float roundPx; float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom; if (width <= height) { roundPx = width / 2; top = 0; bottom = width; left = 0; right = width; height = width; dst_left = 0; dst_top = 0; dst_right = width; dst_bottom = width; } else { roundPx = height / 2; float clip = (width - height) / 2; left = clip; right = width - clip; top = 0; bottom = height; width = height; dst_left = 0; dst_top = 0; dst_right = height; dst_bottom = height; } Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom); final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom); final RectF rectF = new RectF(dst); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, src, dst, paint); if(null != bitmap) { bitmap.recycle(); bitmap = null; } return output; } /** * 字节流转换bitmap * @param b * @return */ public static Bitmap Bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } /** * 压缩bitmap,返回字节流 * @param maxNumOfPixels * @param imgpath * @return */ public static byte[] compressBitmap(int maxNumOfPixels, String imgpath) { double maxSize = 100.00; Bitmap bitmap = loadBitmap(maxNumOfPixels, imgpath); if (null != bitmap) { byte[] bBitmap = convertBitmap(bitmap); if (bitmap != null) { bitmap.recycle(); bitmap = null; } double mid = bBitmap.length / 1024; if (mid > maxSize) { double i = mid / maxSize; bBitmap = compressBitmap((int) (maxNumOfPixels / Math.abs(i)), imgpath); } return bBitmap; } else { return null; } } public static byte[] convertBitmap(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; // LogUtil.e("===baos.toByteArray().length===" + baos.toByteArray().length); // LogUtil.e("===baos.size===" + baos.size()); while (baos.size() / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset();// 重置baos即清空baos options -= 10;// 每次都减少10 bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中 } try { baos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (bitmap != null) { bitmap.recycle(); bitmap = null; } } return baos.toByteArray(); } public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } }