Android 图片操作,Image实战
2016-04-30 10:05
309 查看
平时有很多时候会涉及到图片的操作,如获取缩略图,裁剪图片,旋转图片,获取尺寸,改变大学,drawable与bitmap相互转换等问题。本文给打击总结一些常用的操作,比较基础但是实用。
或者
未完待续,欢迎交流,杜乾,Dusan,Q 291902259。
一,drawable与bitmap相互转换
drawable资源转换为bitmap对象
/** * 将已有的drawable资源转换为bitmap对象 */ public static Bitmap drawableToBitamp(Drawable drawable) { BitmapDrawable bd = (BitmapDrawable) drawable; Bitmap bitmap = bd.getBitmap(); return bitmap; }
或者
/** * 将已有的drawable资源转换为bitmap对象,方式二 */ public static Bitmap drawable2Bitamp(Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); //System.out.println("Drawable转Bitmap"); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w,h,config); //注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图 Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; }
Bitmap转化为drawable
/** * Bitmap转化为drawable */ public static Drawable bitmap2Drawable(Bitmap bitmap) { return new BitmapDrawable(bitmap); }
二,缩放图片到指定的大小
//图片缩放到指定的宽高 public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; }
三,保存bitmap到本地
//将bitmap保存到sdcard中 public static File saveBitmapToSDCard(Bitmap photoBitmap,String path,String photoName){ if (FileUtils.isSDCardAvailable()) { File dir = new File(path); if (!dir.exists()){ dir.mkdirs(); } File photoFile = new File(path , photoName + ".jpg"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)) { fileOutputStream.flush(); //fileOutputStream.close(); return photoFile; } } } catch (FileNotFoundException e) { photoFile.delete(); e.printStackTrace(); } catch (Exception e) { photoFile.delete(); e.printStackTrace(); } finally{ try { if (fileOutputStream!=null) fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; }
四,把bitmap转换成String
/** * 把bitmap转换成String */ public static String bitmapToString(String filePath) { Bitmap bm = getSmallBitmap(filePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 40, baos); byte[] b = baos.toByteArray(); return Base64.encodeToString(b, Base64.DEFAULT); }
五,计算图片的缩放值
/** * 计算图片的缩放值 * @return */ 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) { // Calculate ratios of height and width to requested height andwidth final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // Choose the smallest ratio as inSampleSize value, this will guarantee // a final image with both dimensions larger than or equal to the requested height and width. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
六,根据路径获得图片并返回压缩的bitmap
/** * 根据路径获得图片并压缩,返回bitmap用于显示 */ public static Bitmap getSmallBitmap(String filePath) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, 480, 800); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, options); }
七,判断照片角度
/** * 判断照片角度 * @param path * @return */ public static int readPictureDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; }
八,旋转照片
/** * 旋转照片 * @param bitmap * @param degress * @return */ public static Bitmap rotateBitmap(Bitmap bitmap,int degress) { if (bitmap != null) { Matrix m = new Matrix(); m.postRotate(degress); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); return bitmap; } return bitmap; }
九,处理手机相片的角度旋转
/** * 压缩图片,处理某些手机拍照角度旋转的问题 */ public static String compressImage(String filePath, String targetPath, int quality) { Bitmap bm = getSmallBitmap(filePath); int degree = readPictureDegree(filePath); if(degree!=0){//旋转照片角度 bm=rotateBitmap(bm,degree); } File outputFile=new File(targetPath); try { if (!outputFile.exists()) { outputFile.getParentFile().mkdirs(); outputFile.createNewFile(); }else{ outputFile.delete(); } FileOutputStream out = new FileOutputStream(outputFile); bm.compress(Bitmap.CompressFormat.JPEG, quality, out); }catch (Exception e){ LogUtils.debug(TAG,"compressImage error"+e.toString()); } return outputFile.getPath(); }
未完待续,欢迎交流,杜乾,Dusan,Q 291902259。
相关文章推荐
- Android性能优化典范
- Android ActivityManagerService 基本构架详解
- android sdk 下各个文件夹的作用
- Android自定义视图一:扩展现有的视图,添加新的XML属性
- Android自定义视图一:扩展现有的视图,添加新的XML属性
- Android基础知识回顾
- Android应用资源
- android视频播放框架Vitamio
- 炫酷的底部菜单栏BottomBar
- PendingTransition实现炫酷的Activity切换动画
- Android Design Support Library--TextInputLayout的使用
- gradle升级更新
- Android在Activity中启动一个新进程报错:Can't create handler inside thread that has not called Looper.prepare()。
- android源码解析(十七)-->Activity布局加载流程
- Android 单元测试--系列一
- Android——文本类控件
- [Android]使用全局变量传递数据
- 20145219 《Java程序设计》实验四 Android开发基础设计实验报告
- android悬浮窗口的实现
- Android基础知识:常见布局、logcat相关和文件读写