android 图片处理工具
2016-01-19 11:30
393 查看
摘自WeChat https://github.com/motianhuo/wechat/tree/master/WeChat
** * 图片处理工具 * * @author Ryan.Tang * */ public final class ImageUtils { /** * Drawable转Bitmap * * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w, h, config); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; } /** * Bitmap转Drawable * * @param bitmap * @return */ public static Drawable bitmapToDrawable(Bitmap bitmap) { return new BitmapDrawable(bitmap); } /** * 输输流对象转Bitmap * * @param inputStream * @return * @throws Exception */ public static Bitmap inputStreamToBitmap(InputStream inputStream) throws Exception { return BitmapFactory.decodeStream(inputStream); } /** * 字节字节数组转Bitmap * * @param byteArray * @return */ public static Bitmap byteToBitmap(byte[] byteArray) { if (byteArray.length != 0) { return BitmapFactory .decodeByteArray(byteArray, 0, byteArray.length); } else { return null; } } /** * 字节数组转Drawable对象 * * @param byteArray * @return */ public static Drawable byteToDrawable(byte[] byteArray) { ByteArrayInputStream ins = null; if (byteArray != null) { ins = new ByteArrayInputStream(byteArray); } return Drawable.createFromStream(ins, null); } /** * Bitmap转字节数组 * * @param byteArray * @return */ public static byte[] bitmapToBytes(Bitmap bm) { byte[] bytes = null; if (bm != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); bytes = baos.toByteArray(); } return bytes; } /** * Drawable转字节数组 * * @param drawable * @return */ public static byte[] drawableToBytes(Drawable drawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); byte[] bytes = bitmapToBytes(bitmap); ; return bytes; } /** * Create reflection images * * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { final int reflectionGap = 4; int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, h, w, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } /** * 图片角圆化 * * @param bitmap * @param roundPx * 5 10 * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** * 位图圆角处理 */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) { try { Bitmap targetBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); // 得到画布 Canvas canvas = new Canvas(targetBitmap); // 创建画笔 Paint paint = new Paint(); paint.setAntiAlias(true); // 值越大角度越明显 float roundPx = 10; float roundPy = 10; Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); RectF rectF = new RectF(rect); // 绘制 canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, roundPx, roundPy, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return targetBitmap; } catch (Exception e) { e.printStackTrace(); } catch (Error e) { e.printStackTrace(); } return null; } /** * 重新指定图片大小 * * @param bitmap * @param width * @param height * @return */ public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap newbmp; try { // if (h >= w) { // if (height <= h) { Matrix matrix = new Matrix(); float scaleHeight = ((float) height / h); matrix.postScale(scaleHeight, scaleHeight); newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; // } // } else { // if (width <= w) { // Matrix matrix = new Matrix(); // float scaleWidth = ((float) width / w); // matrix.postScale(scaleWidth, scaleWidth); // newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, // true); // return newbmp; // } // } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 重新指定Drawable大小 * * @param drawable * @param w * @param h * @return */ public static Drawable zoomDrawable(Drawable drawable, int w, int h) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap oldbmp = drawableToBitmap(drawable); Matrix matrix = new Matrix(); float sx = ((float) w / width); float sy = ((float) h / height); matrix.postScale(sx, sy); Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true); return new BitmapDrawable(newbmp); } /** * 根据文件路径+图片名称获得Bitmap对象 * * @param photoName * @return */ public static Bitmap getPhotoFromSDCard(String path, String photoName) { Bitmap photoBitmap = BitmapFactory.decodeFile(path + "/" + photoName + ".png"); if (photoBitmap == null) { return null; } else { return photoBitmap; } } /** * 检查SD卡是否挂载 * * @return */ public static boolean checkSDCardAvailable() { return android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); } /** * 根据给定文件路径+文件名判断SD卡是否存在 * * @param fileName * @return */ public static boolean findPhotoFromSDCard(String path, String photoName) { boolean flag = false; if (checkSDCardAvailable()) { File dir = new File(path); if (dir.exists()) { File folders = new File(path); File photoFile[] = folders.listFiles(); for (int i = 0; i < photoFile.length; i++) { String fileName = photoFile[i].getName().split("\\.")[0]; if (fileName.equals(photoName)) { flag = true; } } } else { flag = false; } } else { flag = false; } return flag; } /** * 将位图存到指定空间 * * @param photoBitmap * @param photoName * @param path */ public static void savePhotoToSDCard(Bitmap photoBitmap, String path, String photoName) { File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(path, photoName); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { fileOutputStream.flush(); } } } catch (FileNotFoundException e) { photoFile.delete(); e.printStackTrace(); } catch (IOException e) { photoFile.delete(); e.printStackTrace(); } finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 从SD卡中删除指定目录下文件 * * @param context * @param path * file:///sdcard/temp.jpg */ public static void deleteAllPhoto(String path) { if (checkSDCardAvailable()) { File file = new File(path); if (file.isDirectory()) { for (File f : file.listFiles()) { f.delete(); } } else { file.delete(); } } } public static void deletePhotoAtPathAndName(String path, String fileName) { if (checkSDCardAvailable()) { File folder = new File(path); File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { System.out.println(files[i].getName()); if (files[i].getName().equals(fileName)) { files[i].delete(); } } } } public static Bitmap getRoundedBitmap(Bitmap bitmap) { return getRoundedCornerBitmap(bitmap, Integer.MAX_VALUE); } /** * 将图片存入缓存目录 */ public static void save2Cache(Context context, String cover, Bitmap bitmap) { File file = new File(context.getCacheDir(), cover + ".png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(file); if (bitmap != null) { if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { fileOutputStream.flush(); } } } catch (FileNotFoundException e) { file.delete(); e.printStackTrace(); } catch (IOException e) { file.delete(); e.printStackTrace(); } finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories