在工作中自己写的或者收集的关于bitmap操作相关的方法,其中部分方法用到了imageloader相关类 可以根据具体需求替换 public class BitmapUtil { public static final int IO_BUFFER_SIZE = 8 * 1024; private s
public class BitmapUtil { public static final int IO_BUFFER_SIZE = 8 * 1024; private static Bitmap.CompressFormat mCompressFormat = Bitmap.CompressFormat.JPEG; private static int mCompressQuality = 100; public static String saveMyBitmap(String dirStr, String nameStr,Bitmap mBitmap, Bitmap.CompressFormat type, int quliat) throws IOException { if (mBitmap == null) return ""; File file = new File(dirStr); if (!file.exists()){ file.mkdirs(); } file = null; File bitmapFile = new File(dirStr + nameStr); FileOutputStream fos = new FileOutputStream(bitmapFile); BufferedOutputStream bos = new BufferedOutputStream(fos); mBitmap.compress(type, quliat, bos); bos.flush(); bos.close(); return bitmapFile.getAbsolutePath(); } /** * 处理图片 * * @param bm 所要转换的bitmap * @param newWidth 新的宽 * @param newHeight 新的高 * @return 指定宽高的bitmap */ public static Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) { // 获得图片的宽高 int width = bm.getWidth(); int height = bm.getHeight(); // 计算缩放比例 float scaleWidth = ((float) newWidth) / width; float scaleHeight; if (newHeight != 0) { scaleHeight = ((float) newHeight) / height; }else{ scaleHeight = scaleWidth; } // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 www.2cto.com bm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); return bm; } public static Bitmap decodeFile(InputStream input, String cropUrl, int maxWidth, int maxHeight) { if (input == null) { return null; } Bitmap boundBmp = null; Bitmap scaleBmp = null; byte[] data = readStream(input); try { // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; boundBmp = BitmapFactory.decodeByteArray(data, 0, data.length, o); // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 50; // 平板上适当高清点 int width_tmp = o.outWidth, height_tmp = o.outHeight; if (width_tmp < maxWidth){ o.inSampleSize = 1; o.inJustDecodeBounds = false; scaleBmp = zoomImg(BitmapFactory.decodeByteArray(data, 0, data.length, o),maxWidth,0); }else { int scale = 1; while (true) { if (width_tmp <= maxWidth && height_tmp <= maxHeight ) { break; } width_tmp *= 0.25; height_tmp *= 0.25; // width_tmp = maxWidth; scale *= 2; } // decode with inSampleSize o.inSampleSize = scale; o.inJustDecodeBounds = false; scaleBmp = BitmapFactory.decodeByteArray(data, 0, data.length, o); Log.e("util", "tepWidth:" + width_tmp + "height:" + height_tmp); } if (cropUrl != null) writeBitmapToFile(scaleBmp, cropUrl); } catch (Exception e) { e.printStackTrace(); } catch (OutOfMemoryError e) { Util.setLog("BitmapUtil","decodeBitmapOOM"); e.printStackTrace(); } finally { try { input.close(); } catch (IOException e) { e.printStackTrace(); } if (boundBmp != null) boundBmp.recycle(); } return scaleBmp; } /** * 根据路径获取图片宽高(不实际加载图片) * @param path * @return */ public static int[] getBitmapSize(String path){ InputStream inputStream = path2Input(path); int[] result = new int[2]; if (inputStream == null) return null; byte[] data = readStream(inputStream); BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(data, 0, data.length, o); result[0] = o.outWidth; result[1] = o.outHeight; try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return result; } /** * 讲路径转换成bitmap * @param path * @return */ public static Bitmap path2Bitmap(String path){ return byteArray2Bitmap(readStream(path2Input(path))); } /** * 讲路径转换成bitmap * @param path * @return */ public static Bitmap path2Bitmap(String path, int maxWidth, int maxHeight){ return decodeFile(path2Input(path), null, maxWidth, maxHeight); } /** * 将路径转换成流 * @param path * @return */ public static InputStream path2Input(String path){ InputStream inputStream = null; File file = new File(path); if (file.exists()){ try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } } return inputStream; } /** * 将byte数组转换成bitmap * @param bytes * @return */ public static Bitmap byteArray2Bitmap(byte[] bytes){ if (bytes != null && bytes.length>0) return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); return null; } public static byte[] bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } public static String bitmap2Base64(Bitmap bitmap){ return Base64.encodeToString(bitmap2Bytes(bitmap), 0); } public static Bitmap base642Bitmap(String base64Str){ return byteArray2Bitmap(Base64.decode(base64Str, 0)); } /** * 得到图片字节流 数组大小 为解决网络inputstream获取不到bitmap的bug */ private static byte[] readStream(InputStream inStream) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int len = 0; try { while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { if (outStream != null) { try { outStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (inStream != null) { try { inStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return outStream.toByteArray(); } public static boolean writeBitmapToFile(Bitmap bitmap, String path) throws IOException, FileNotFoundException { if (bitmap == null) return false; OutputStream out = null; try { File file = new File(path); out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE); return bitmap.compress(mCompressFormat, mCompressQuality, out); } finally { if (out != null) { out.close(); } } } /** * 生成图标局部高斯模糊并且与imageview绑定 * @param imgeView * @param bitmap * @param radius * @param x * @param y * @param width * @param height */ public static void setBlurToImgeView(ImageView imgeView, Bitmap bitmap, int radius, int round, int x, int y, int width, int height){ FastBlur fastBlur = new FastBlur(); RoundedBitmapDisplayer roundedBitmapDisplayer = new RoundedBitmapDisplayer(round,0); Bitmap finalBitmap = fastBlur.fastblur(bitmap,radius,imgeView,x, y, width, height); roundedBitmapDisplayer.display(finalBitmap, (new ImageViewAware(imgeView)), LoadedFrom.MEMORY_CACHE); } /** * 生成图标局部高斯模糊并且与imageview绑定 * @param imgeView * @param radius * @param x * @param y * @param width * @param height */ public static void setBlurToImgeView(Activity activity, final ImageView imgeView, final ImageView fadeOutIv, final View view, final int radius, final int x, final int y, final int width, final int height){ final Bitmap bitmap = Bitmap.createBitmap(width,height, Bitmap.Config.RGB_565); final FastBlur fastBlur = new FastBlur(); final FadeInBitmapDisplayer fadeInBitmapDisplayer = new FadeInBitmapDisplayer(300); final Canvas canvas = new Canvas(bitmap); activity.runOnUiThread(new Runnable() { @Override public void run() { view.draw(canvas); final Bitmap finalBitmap = fastBlur.fastblur(bitmap, radius, imgeView, x, y, width, height); fadeOutIv.setImageDrawable(imgeView.getDrawable()); fadeOutIv.setVisibility(View.VISIBLE); fadeInBitmapDisplayer.display(finalBitmap, (new ImageViewAware(imgeView)), LoadedFrom.MEMORY_CACHE); fadeOutAnimation(fadeOutIv, 500); bitmap.recycle(); } }); } private static void fadeOutAnimation(ImageView imageView, long durationMillis){ AlphaAnimation fadeImage = new AlphaAnimation(1.0f, 0.0f); fadeImage.setDuration(durationMillis); fadeImage.setInterpolator(new DecelerateInterpolator()); imageView.startAnimation(fadeImage); imageView.setVisibility(View.GONE); } /** * 将图片有颜色的地方转换成新的颜色 * @param drawable * @param colors * @return */ public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) { final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); DrawableCompat.setTintList(wrappedDrawable, colors); return wrappedDrawable; } public static Bitmap getMosaicsBitmaps(Bitmap bmp, double precent) { long start = System.currentTimeMillis(); int bmpW = bmp.getWidth(); int bmpH = bmp.getHeight(); int[] pixels = new int[bmpH * bmpW]; bmp.getPixels(pixels, 0, bmpW, 0, 0, bmpW, bmpH); int raw = (int) (bmpW * precent); int unit; if (raw == 0) { unit = bmpW; } else { unit = bmpW / raw; //原来的unit*unit像素点合成一个,使用原左上角的值 } // if (unit >= bmpW || unit >= bmpH) { // return getMosaicsBitmap(bmp, precent); // } for (int i = 0; i < bmpH; ) { for (int j = 0; j < bmpW; ) { int leftTopPoint = i * bmpW + j; for (int k = 0; k < unit; k++) { for (int m = 0; m < unit; m++) { int point = (i + k) * bmpW + (j + m); if (point < pixels.length) { pixels[point] = pixels[leftTopPoint]; } } } j += unit; } i += unit; } long end = System.currentTimeMillis(); return Bitmap.createBitmap(pixels, bmpW, bmpH, Bitmap.Config.RGB_565); } /** * 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; } }