Android手机拍照和手机相册选取图片的工具类ImageUtils
来源:互联网 发布:网管员必读 网络基础 编辑:程序博客网 时间:2024/04/29 06:40
package com.shentaiwang.jsz.savepatient.util;import android.app.Activity;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.util.DisplayMetrics;import android.util.Log;import android.view.WindowManager;import android.widget.Toast;import java.io.BufferedOutputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;/** * Created by user on 2016/12/16. */public class ImageUtil { public static final int CODE_SETHDIMG_ALNUM = 1; public static final int CODE_SETHDIMG_CAM = 2; public static final int CROP_IMG = 100; public File camImgFile = null; public File cropImgFile = null; public void gotoCam(Context context) { try { //获取当前系统的android版本号 int currentApiVersion = android.os.Build.VERSION.SDK_INT; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()); String str = dateFormat.format(new Date(System.currentTimeMillis())); //设置保存拍摄照片路径(DCIM/Camera/Modle_PictureWall_img_20170212_122223.jpg) //路径默认,若修改则不能保存照片 camImgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "/Camera/Modle_PictureWall_img_" + str + ".jpg"); Uri outputImgUriFromCam = null; if (currentApiVersion < 24) { outputImgUriFromCam = Uri.fromFile(camImgFile); } else { ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, camImgFile.getAbsolutePath()); outputImgUriFromCam = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } //跳转到照相机拍照 Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); it.putExtra(MediaStore.EXTRA_OUTPUT, outputImgUriFromCam); ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_CAM);// startActivityForResult(it,CODE_SETHDIMG_CAM); }catch (Exception e){ Toast.makeText(context,"请开启摄像权限",Toast.LENGTH_SHORT).show(); } } public void gotoAlbum(Context context) { Intent it = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); ((Activity) context).startActivityForResult(it, CODE_SETHDIMG_ALNUM);// startActivityForResult(it,CODE_SETHDIMG_ALNUM); } public void cropImg(Context context, boolean isFromCam, boolean isSetHd, Intent data, String fileName) { File inputFile = null; if (isFromCam) { inputFile = camImgFile; } else { Log.d("ImageUtil", "cropImg:图片数据: "+data.getData()); inputFile = new File(getRealPathFromURI(context, data.getData())); } //设置保存路径名称 cropImgFile = new File(context.getExternalFilesDir(fileName), String.valueOf(System.currentTimeMillis())); WindowManager manager = ((Activity) context).getWindowManager(); DisplayMetrics outMetrics = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(outMetrics); Intent it = new Intent("com.android.camera.action.CROP"); it.setDataAndType(getImageContentUri(context, inputFile), "image/*"); it.putExtra("output", Uri.fromFile(cropImgFile)); it.putExtra("crop", "true"); it .putExtra("scale",true);//黑边 it .putExtra("scaleUpIfNeeded",true);//黑边 if (isSetHd) { // 裁剪框比例 it.putExtra("aspectX", 1); it.putExtra("aspectY", 1); // 输出图片大小 it.putExtra("outputX", outMetrics.widthPixels / 2); it.putExtra("outputY", outMetrics.widthPixels / 2); } else { // 裁剪框比例 it.putExtra("aspectX", 3); it.putExtra("aspectY", 2); // 输出图片大小 it.putExtra("outputX", 600); it.putExtra("outputY", 400); } // 返回格式 it.putExtra("outputFormat", "JPEG"); ((Activity) context).startActivityForResult(it, CROP_IMG);// startActivityForResult(it, CROP_IMG); } public String getRealPathFromURI(Context context, Uri uri) { String mImgPath; String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, filePathColumn, null, null, null); if(cursor!=null){ cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); mImgPath=picturePath; }else{ mImgPath=uri.getPath(); } return mImgPath; } public Uri getImageContentUri(Context context, File imageFile) { String filePath = imageFile.getAbsolutePath(); Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{"_id"}, "_data=? ", new String[]{filePath}, (String) null); if (cursor != null && cursor.moveToFirst()) { int values1 = cursor.getInt(cursor.getColumnIndex("_id")); Uri baseUri = Uri.parse("content://media/external/images/media"); return Uri.withAppendedPath(baseUri, "" + values1); } else if (imageFile.exists()) { ContentValues values = new ContentValues(); values.put("_data", filePath); return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } else { return null; } } public void refreshAlbum(Context context, String path) { context.sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path))); } public static byte[] bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } /** * 根据byte数组生成文件 * * @param bytes 生成文件用到的byte数组 */ public static boolean createFileWithByte(byte[] bytes) { String fileName = "portrait.png"; // TODO Auto-generated method stub /** * 创建File对象,其中包含文件所在的目录以及文件的命名 * */ if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SDCard进行操作 //获取SDCard指定目录下 String sdCardDir = Environment.getExternalStorageDirectory() + "/CropImage/"; File dirFile = new File(sdCardDir);//目录转换成文件夹 if (!dirFile.exists()) {//如果不存在,就建立这个文件夹 dirFile.mkdir(); } File file = new File(sdCardDir, fileName); // 创建FileOutputStream对象 FileOutputStream outputStream = null; // 创建BufferedOutputStream对象 BufferedOutputStream bufferedOutputStream = null; try { // 如果文件存在则删除 if (file.exists()) { file.delete(); } // 在文件系统中根据路径创建一个新的空文件 file.createNewFile(); // 获取FileOutputStream对象 outputStream = new FileOutputStream(file); // 获取BufferedOutputStream对象 bufferedOutputStream = new BufferedOutputStream(outputStream); // 往文件所在的缓冲输出流中写byte数据 bufferedOutputStream.write(bytes); // 刷出缓冲输出流,该步很关键,要是不执行flush()方法,那么文件的内容是空的。 bufferedOutputStream.flush(); } catch (Exception e) { // 打印异常信息 e.printStackTrace(); } finally { // 关闭创建的流对象 if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedOutputStream != null) { try { bufferedOutputStream.close(); } catch (Exception e2) { e2.printStackTrace(); } } } return true; } return false; } /** * 获取文件路径并转换成Bitmap * * @param filepath * @return */ public static Bitmap getFilePath(String filepath) { File file = new File(filepath); Bitmap bm = null; if (file.exists()) { bm = BitmapFactory.decodeFile(filepath); } return bm; } public static Bitmap Bytes2Bitmap(byte[] bytes) { if (bytes.length != 0) { return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } else { return null; } } public static Bitmap toRoundCorner(Bitmap bitmap, float ratio) {//把正方形图片转化为圆形,ratio为2 Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawRoundRect(rectF, bitmap.getWidth() / ratio, bitmap.getHeight() / ratio, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } 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; } public static String savePhotoToSDCard(Bitmap bitmap) { String photoName = ""; if (checkSDCardAvailable()) { // 图片时间命名 SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis()); photoName = format.format(date); // 存储至DCIM文件夹下 File dir = new File(Environment .getExternalStorageDirectory() + "/Stw/temp/save/"); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(dir.getAbsolutePath(), photoName + ".png"); Bitmap photoBitmap = bitmap;// FileOutputStream fileOutputStream = null;// try {// fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) {// double maxSize = 400.00; // 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大) ByteArrayOutputStream baos = new ByteArrayOutputStream(); photoBitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); int options = 80;//先压缩到80% while (baos.toByteArray().length / 1024 > 200) { // 循环判断如果压缩后图片是否大于200kb,大于继续压缩 if (options <= 0) {//有的图片过大,可能当options小于或者等于0时,它的大小还是大于目标大小,于是就会发生异常,异常的原因是options超过规定值。所以此处需要判断一下 break; } baos.reset();// 重置baos即清空baos options -= 10;// 每次都减少10 bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos); }// byte[] b = baos.toByteArray();// // 将字节换成KB// double mid = b.length / 1024;// // 判断bitmap占用空间是否大于允许空间 如果大于则压小于则不压缩// if (mid > maxSize) {// // 获取bitmap大小 是允许最大大小的多少// double i = mid / maxSize;// // 压缩 此处用到平方将宽带和高度压缩掉对应的平方根// // 保持刻度和高度和原bitmap比率,压缩后也达到了大小占用空间的大小)// photoBitmap = zoomImage(photoBitmap,// photoBitmap.getWidth() / Math.sqrt(i),// photoBitmap.getHeight() / Math.sqrt(i));// }// if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,// fileOutputStream)) {// fileOutputStream.flush();// // fileOutputStream.close();// } try { FileOutputStream fos = new FileOutputStream(photoFile); fos.write(baos.toByteArray()); fos.close(); baos.close(); return photoFile.getAbsolutePath(); } catch (Exception e) { } }// } catch (FileNotFoundException e) {// photoFile.delete();// e.printStackTrace();// } catch (IOException e) {// photoFile.delete();// e.printStackTrace();// } finally {// try {// if (fileOutputStream != null) {// fileOutputStream.close();// }// } catch (IOException e) {// e.printStackTrace();// }// } } return null; } /** * 压缩图片 */ public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.getWidth(); float height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放�? float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, (int) height, matrix, true); return bitmap; } //检查sd卡是否存在 public static boolean checkSDCardAvailable() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); }}
阅读全文
0 0
- Android手机拍照和手机相册选取图片的工具类ImageUtils
- Android 选取手机相册图片方法
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- Android设置头像,手机拍照或从本地相册选取图片作为头像
- android 手机拍照。。相册 取图片
- ionic 的项目实现从手机相册选取图片或拍照并上传至服务器
- H5调用手机的摄像头拍照上传以及手机相册选取照片但不支持Android的分析
- 三星等手机拍照选取图片,图片反转的问题
- Android手机拍照或选取图库图片作为头像
- H5调用手机的摄像头拍照上传以及手机相册选取照片
- 超级好用的工具类:图片选取(拍照/相册)
- 图片拍照上传和相册选取
- android 拍照+从手机相册选择返回图片到imagview
- android 从相册选取图片在小米手机报错的解决办法
- Android图片的选取和拍照
- Unity3D,获取相册图片,手机拍照
- XYOJ 判断闰年
- Android笔记(23)TagView标签
- 从load加载数据类型是struct说起
- Java设计模式
- CUDA编程经验技术总结 系列之《内存模块》
- Android手机拍照和手机相册选取图片的工具类ImageUtils
- Flume + Solr + log4j搭建web日志采集系统
- 分析并实现1到n阶贝塞尔
- C++中的继承和组合区别使用
- HDU 5112 A Curious Matt (水题)
- XYOJ 1003 简单公式计算
- HDU 5113 Black And White (搜索剪枝)
- linux系统中文件和目录的命名
- eclipse 将 tab 换成 4个空格