public final class BitmapUtils { public static final String TAG = "BitmapUtil"; private static int sShotScreenWidth = 480; private static int sShotScreenHeight = 720; private static int sShotScreenSize = sShotScreenWidth * sShotScreenHeight; @SuppressLint("StaticFieldLeak") private static Context mContext; @SuppressLint("StaticFieldLeak") private static Activity mActivity; public void init(Context context,Activity ac) { mContext=context; mActivity=ac; DisplayMetrics dm = new DisplayMetrics(); ac.getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕分辨率 sShotScreenWidth = dm.widthPixels; sShotScreenHeight = dm.heightPixels; sShotScreenSize = sShotScreenWidth * sShotScreenHeight; } /** * 图片合成 * * @param bitmap 位图1 * @param mark 位图2 * @return Bitmap */ public static Bitmap createBitmap(Bitmap bitmap, Bitmap mark) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); int mW = mark.getWidth(); int mH = mark.getHeight(); Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个长宽一样的位图 Canvas cv = new Canvas(newbitmap); cv.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入bitmap cv.drawBitmap(mark, w - mW , h - mH , null);// 在右下角画入水印mark cv.save(Canvas.ALL_SAVE_FLAG);// 保存 cv.restore();// 存储 return newbitmap; } /** * 放大缩小图片 * @param bitmap 位图 * @param w 新的宽度 * @param h 新的高度 * @return Bitmap */ public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidht = ((float) w / width); float scaleHeight = ((float) h / height); matrix.postScale(scaleWidht, scaleHeight); return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } /** * 旋转图片 * @param bitmap 要旋转的图片 * @param angle 旋转角度 * @return bitmap */ public static Bitmap rotate(Bitmap bitmap,int angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } /** * 圆形图片 *@param source 位图 * @param strokeWidth 裁剪范围 0表示最大 * @param bl 是否需要描边 * @param bl 画笔粗细 * @param bl 颜色代码 * @return bitmap */ public static Bitmap createCircleBitmap(Bitmap source, int strokeWidth, boolean bl,int edge,int color) { int diameter = source.getWidth() < source.getHeight() ? source.getWidth() : source.getHeight(); Bitmap target = Bitmap.createBitmap(diameter, diameter, Config.ARGB_8888); Canvas canvas = new Canvas(target);//创建画布 Paint paint = new Paint(); paint.setAntiAlias(true); canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint);//绘制圆形 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取相交裁剪 canvas.drawBitmap(source, strokeWidth, strokeWidth, paint); if(bl) { if (color == 0) color = 0xFFFEA248;//默认橘黄色 paint.setColor(color); paint.setStyle(Paint.Style.STROKE);//描边 paint.setStrokeWidth(edge); canvas.drawCircle(diameter / 2, diameter / 2, diameter / 2, paint); } return target; } /** * 圆角图片 * @param bitmap 位图 * @param rx x方向上的圆角半径 * @param ry y方向上的圆角半径 * @param bl 是否需要描边 * @param bl 画笔粗细 * @param bl 颜色代码 * @return bitmap */ public static Bitmap createCornerBitmap(Bitmap bitmap,int rx,int ry,boolean bl,int edge,int color) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output);//创建画布 Paint paint = new Paint(); paint.setAntiAlias(true); Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); RectF rectF = new RectF(rect); canvas.drawRoundRect(rectF, rx, ry, paint);//绘制圆角矩形 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));//取相交裁剪 canvas.drawBitmap(bitmap, rect, rect, paint); if(bl) { if (color == 0) color = 0xFFFEA248;//默认橘黄色 paint.setColor(color); paint.setColor(color); paint.setStyle(Paint.Style.STROKE);//描边 paint.setStrokeWidth(edge); canvas.drawRoundRect(rectF, rx, ry, paint); } return output; } /** * 按比例裁剪图片 * @param bitmap 位图 * @param wScale 裁剪宽 0~100% * @param hScale 裁剪高 0~100% * @return bitmap */ public static Bitmap cropBitmap(Bitmap bitmap, float wScale, float hScale) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); int wh = (int) (w * wScale); int hw = (int) (h * hScale); int retX = (int) (w * (1 - wScale) / 2); int retY = (int) (h * (1 - hScale) / 2); return Bitmap.createBitmap(bitmap, retX, retY, wh, hw, null, false); } /** * 获得带倒影的图片方法 * @param bitmap 位图 * @param region 倒影区域 0.1~1 * @return bitmap */ public static Bitmap createReflectionBitmap(Bitmap bitmap,float region) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1);//镜像缩放 Bitmap reflectionBitmap = Bitmap.createBitmap( bitmap,0 , (int)(height*(1-region))//从哪个点开始绘制 , width ,(int) (height*region)//绘制多高 , matrix, false); Bitmap reflectionWithBitmap = Bitmap.createBitmap(width,height+ (int) (height*region), Config.ARGB_8888); Canvas canvas = new Canvas(reflectionWithBitmap); canvas.drawBitmap(bitmap, 0, 0, null); canvas.drawBitmap(reflectionBitmap, 0, height , null); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, reflectionWithBitmap.getHeight() , 0x70ffffff, 0x00ffffff, TileMode.CLAMP); Paint paint = new Paint(); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));//取两层绘制交集。显示下层。 canvas.drawRect(0, height, width, reflectionWithBitmap.getHeight() , paint); return reflectionWithBitmap; } /** * 图片质量压缩 * @param bitmap * @param many 百分比 * @return */ public static Bitmap compressBitmap(Bitmap bitmap, float many){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, (int)many*100, baos); ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); return BitmapFactory.decodeStream(isBm, null, null); } /** * 高级图片质量压缩 *@param bitmap 位图 * @param maxSize 压缩后的大小,单位kb */ public static Bitmap imageZoom(Bitmap bitmap, double maxSize) { // 将bitmap放至数组中,意在获得bitmap的大小(与实际读取的原文件要大) ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 格式、质量、输出流 bitmap.compress(Bitmap.CompressFormat.PNG, 70, baos); byte[] b = baos.toByteArray(); // 将字节换成KB double mid = b.length / 1024; // 获取bitmap大小 是允许最大大小的多少倍 double i = mid / maxSize; // 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩 doRecycledIfNot(bitmap); if (i > 1) { // 缩放图片 此处用到平方根 将宽带和高度压缩掉对应的平方根倍 // (保持宽高不变,缩放后也达到了最大占用空间的大小) return scaleWithWH(bitmap,bitmap.getWidth() / Math.sqrt(i), bitmap.getHeight() / Math.sqrt(i)); } return null; } /*** * 图片缩放 *@param bitmap 位图 * @param w 新的宽度 * @param h 新的高度 * @return Bitmap */ public static Bitmap scaleWithWH(Bitmap bitmap, double w, double h) { if (w == 0 || h == 0 || bitmap == null) { return bitmap; } else { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = (float) (w / width); float scaleHeight = (float) (h / height); matrix.postScale(scaleWidth, scaleHeight); return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } } /** * YUV视频流格式转bitmap * @param data YUV视频流格式 * @return width 设置宽度 * @return width 设置高度 */ public static Bitmap getBitmap(byte[] data, int width, int height) { Bitmap bitmap; YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null); //data是onPreviewFrame参数提供 ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, yuvimage.getWidth(), yuvimage.getHeight()), 100, baos);// // 80--JPG图片的质量[0-100],100最高 byte[] rawImage = baos.toByteArray(); BitmapFactory.Options options = new BitmapFactory.Options(); SoftReference<Bitmap> softRef = new SoftReference<Bitmap>(BitmapFactory.decodeByteArray(rawImage, 0, rawImage .length, options)); bitmap = softRef.get(); return bitmap; } /** * 图片资源文件转bitmap * @param file 图片的绝对路径 * @return bitmap */ public static Bitmap getBitmapResources(Context context,int resId){ return BitmapFactory.decodeResource(context.getResources(),resId); } /** * 将图片路径转Bitmap * @Param path 图片路径 * @return Bitmap */ public static Bitmap getBitmapPath(String path){ return BitmapFactory.decodeFile(path); } /** * bitmap保存到指定路径 * @param file 图片的绝对路径 * @param file 位图 * @return bitmap */ public static boolean saveFile(String file, Bitmap bmp) { if(TextUtils.isEmpty(file) || bmp == null) return false; File f = new File(file); if (f.exists()) { f.delete(); }else { File p = f.getParentFile(); if(!p.exists()) { p.mkdirs(); } } try { FileOutputStream out = new FileOutputStream(f); bmp.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } return true; } /** * 回收一个未被回收的Bitmap *@param bitmap */ public static void doRecycledIfNot(Bitmap bitmap) { if (!bitmap.isRecycled()) { bitmap.recycle(); } } /** * 将图片转换成Base64编码的字符串 */ public static String imageToBase64(String path){ if(TextUtils.isEmpty(path)){ return null; } InputStream is = null; byte[] data = null; String result = null; try{ is = new FileInputStream(path); //创建一个字符流大小的数组。 data = new byte[is.available()]; //写入数组 is.read(data); //用默认的编码格式进行编码 result = Base64.encodeToString(data,Base64.DEFAULT); }catch (Exception e){ e.printStackTrace(); }finally { if(null !=is){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; }}
修改图片的颜色
private Bitmap createRGBImage(Bitmap bitmap,int type) { int bitmap_w = bitmap.getWidth(); int bitmap_h = bitmap.getHeight(); int[] arrayColor = new int[bitmap_w * bitmap_h]; int count = 0; int color; for (int i = 0; i < bitmap_h; i++) { for (int j = 0; j < bitmap_w; j++) { color = bitmap.getPixel(j, i); if (color == -131073) {//颜色十进制值 arrayColor[count] = Color.TRANSPARENT; }else{ arrayColor[count] = color; } count++; } } bitmap = Bitmap.createBitmap(arrayColor, bitmap_w, bitmap_h, Bitmap.Config.ARGB_8888); return bitmap; }
相关推荐
bitmap工具类,给以用以避免OOM,强大
Android中bitmap转化成string格式的工具类,主要用于联网操作传递数据情境中
一个基于android平台Bitmap 工具类,一个基于android平台Bitmap 工具类,一个基于android平台Bitmap 工具类,一个基于android平台Bitmap 工具类,一个基于android平台Bitmap 工具类,一个基于android平台Bitmap 工具...
自己使用的最简易的,获取圆形图片工具类方法,里面方法较为简陋,主要用于对图片进行二次采样,切圆,便于开发者获取圆形图片
本资源包括常用工具类,目前收录了数组工具类、异步工具类、base64工具类、bitmap工具类、缓存工具类、时间工具类、http连接、json、IO、Map、MD5、数据库、SD卡、UbbToHtml等工具类合集
Android中压缩bitmap的工具类,用于压缩bitmap图片用,适用于图片体积过大而同时显示等对图片质量要求不大的场景
Bitmap 工具类主要包括获取 Bitmap 和对 Bitmap 的操作 CipherUtils 加密与解密的工具类 Colors 常用颜色色值工具类 CommonUtil 一些通用的方法 ChannelUtil 为打包而生的渠道工具类 极速打包传送门 ...
本资源包括常用工具类,目前收录了数组工具类、异步工具类、base64工具类、bitmap工具类、缓存工具类、时间工具类、http连接、json、IO、Map、MD5、数据库、SD卡、UbbToHtml等工具类合集
Drawable Bitmap InputStream byte[]相互转化工具类,单例模式
包括将彩色图转换为灰度图、将一个图片切割成多个图片、图片的缩放、图片的旋转、修改图片透明度、获得圆角图片、绘制带边框的文字图片、绘制带倒影图片等
AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabaseOpenHelper 目录资源获取 Base64 加密 BitmapUtil 获取Bitmap和对Bitmap的操作 ChannelUtil 获取市场号 Colors 颜色工具类 包括常用的色值 DES ...
Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式 博文介绍:http://blog.csdn.net/qq_21376985/article/details/52083611
安卓的图片工具类,可处理Bitmap和ImageView对象,实现了以下功能: 1.saveBitmap: 把Bitmap对象持久存储到SD卡或手机内存. 2.getViewBitmap: 从view得到bitmap对象 3.addWatermark: Bitmap加水印 4.zoomBitmap: 放大...
在网上收集的一些常用工具类,包括动画、文件、DeBug、IO流、MD5、String、Colors等,
Android开发、Bitmap 压缩相关操作...判断两字符串是否相等 判断两字符串忽略大小写是否相等 null转为长度为0的字符串 返回字符串长度 首字母大写 首字母小写 反转字符串 转化为半角字符 转化为全角字符)等处理工具类
一个方法,传入bitmap图形资源,变换成圆形的bitmap资源,小工具类。适用在头像上。附带缩放图片方法
一个工具类,主要功能是将 Bitmap转换为Base64编码
该类传入 Bitmap 服务器访问地址 图片名字 服务器的key
#这个是我自己收集整理的一些常用的工具类##有好的工具类,欢迎提交PR 作者微博: ##增加常用库的README_LIB 内容说明 工具 描述 动画工具类 APP相关信息工具类 目录资源获取 加密 获取Bitmap和对Bitmap的操作 ...
Android图片Bitmap和字符串String之间相互转换的工具类,外加项目代码,封装好的,直接可以用,