package com.jqyd.utils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import com.example.camera.R; import com.jqyd.camera.library.AccessoryDTO; import com.jqyd.camera.library.AddPhotoActivity; import com.jqyd.camera.library.CustomCameraActivity; import com.jqyd.camera.library.PhotoDisplayBlock; import com.jqyd.utils.UIUtil; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.ExifInterface; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; import android.widget.ImageView; public class PhotoUtil { public static final String SDCARD_ROOT_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路径 public static final String SAVE_PATH_IN_SDCARD = "/jqyd/Images/picture"; //图片及其他数据保存文件夹 public static String PhotoName; public static final int REQUEST_Photograph = 101; public static final int REQUEST_ChoosePicture = 100; public static final int REQUEST_AddChoosePicture = 103; public static final int REQUEST_Photograph2 = 104; public static List<AccessoryDTO> photos= new ArrayList<AccessoryDTO>(); public static AccessoryDTO photo=new AccessoryDTO(); public static boolean isPhotoing=false; /** * 返回图片路径 * @return */ public static String getPhotoPath(){ return SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+PhotoName; } /** * 根据时间生成照片文件名称 * * @return */ public static String createPhotoName() { Calendar cal=Calendar.getInstance(); SimpleDateFormat df=new SimpleDateFormat("yyyyMMdd"); DecimalFormat MonthFormat=new DecimalFormat("00"); String h=MonthFormat.format(cal.get(Calendar.HOUR_OF_DAY)); String m=MonthFormat.format(cal.get(Calendar.MINUTE)); String s=MonthFormat.format(cal.get(Calendar.SECOND)); StringBuffer b=new StringBuffer(); b.append(df.format(cal.getTime()) + "_"); b.append(h+m+s + ".jpg" ); return b.toString(); } /** * 调用系统相机 * @param context */ public static void startSysCamera(Activity context){ if(PhotoUtil.isHasSdcard()){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //定义图片名称 PhotoName = createPhotoName(); File f=new File(PhotoUtil.SDCARD_ROOT_PATH+PhotoUtil.SAVE_PATH_IN_SDCARD); if(!f.exists()){ f.mkdirs(); } Log.e("PhotoDisplayBlock.size", PhotoDisplayBlock.size+"----"); if(PhotoUtil.photos.size()<PhotoDisplayBlock.size){ AccessoryDTO photo=new AccessoryDTO(); photo.setPath(PhotoUtil.getPhotoPath()); photo.setName(PhotoUtil.PhotoName); System.out.println("PhotoUtil.PhotoName----"+photo.getName()); photo.setType(AccessoryDTO.AccessoryType.image.getCode()); CameraMyApp cameramyApp= (CameraMyApp) context.getApplication(); cameramyApp.setPhoto(photo); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(SDCARD_ROOT_PATH + SAVE_PATH_IN_SDCARD,PhotoName))); context.startActivityForResult(intent, REQUEST_Photograph2); }else{ UIUtil.alertMsg(context, "最多拍摄"+PhotoDisplayBlock.size+"张照片"); } }else{ UIUtil.alertMsg(context, "请插入SD卡"); } } /** * 调用自定义相机 * @param context */ public static void startSelfCamera(Activity context){ if(PhotoUtil.isHasSdcard()){ Log.e("PhotoDisplayBlock.size", PhotoDisplayBlock.size+"----"); if(PhotoUtil.photos.size()<PhotoDisplayBlock.size){ Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setClass(context,CustomCameraActivity.class); context.startActivityForResult(intent, REQUEST_Photograph); //实现左移动画效果 context.overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left); }else{ UIUtil.alertMsg(context, "最多拍摄"+PhotoDisplayBlock.size+"张照片"); } }else{ UIUtil.alertMsg(context, "请插入SD卡"); } } /** * 打开系统相册选取照片 * @param context */ public static void chooseSysPhoto(Activity context){ Intent intent = new Intent(); /* 开启Pictures画面Type设定为image */ intent.setType("image/*"); /* 使用Intent.ACTION_GET_CONTENT这个Action */ intent.setAction(Intent.ACTION_GET_CONTENT); /* 取得相片后返回本画面 */ context.startActivityForResult(intent, REQUEST_ChoosePicture); } /** * 打开添加照片界面,可以拍照或选择手机内部已存照片 * @param context */ public static void AddOrChoosePhoto(Activity context){ Intent intent = new Intent(); intent.setClass(context,AddPhotoActivity.class); context.startActivityForResult(intent, REQUEST_AddChoosePicture); } /** * 检查存储卡是否插入 * @return */ public static boolean isHasSdcard() { String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } public static void Clear(){ PhotoName=""; if(photos!=null){ photos.clear(); // photos=null; } } /** * byte[] → Bitmap * @param b * @return */ public static Bitmap Bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } /** * Bitmap → byte[] * @param bm * @param quality 100表示不压缩, 0-100之前表示压缩,数值越小,压缩程度越高 * @return */ public static byte[] Bitmap2Bytes(Bitmap bm,int quality) { if(quality<=0 || quality>100){ quality=100; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, quality, baos); return baos.toByteArray(); } /** * 根据图片路径读取图片,并进行缩放压缩 ,返回图片字节数组 * @param photpath * @return 压缩后图片字节数组 */ public static byte[] PhotoToBytes(String photpath){ byte[] res=null; File f=new File(photpath); if(f.exists()){ Bitmap bm=ReadBitmap(photpath,600,800); res=Bitmap2Bytes(bm,80); bm.recycle(); } return res; } /** * 计算图片缩放比例 * @param options 原图 * @param reqWidth 希望宽度 * @param reqHeight 希望高度 * @return 缩放比例 1表示宽度和高度不缩放,为2表示压缩后的宽度与高度为原来的1/2 */ public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) { int height = options.outHeight; int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { int heightRatio = Math.round((float) height / (float) reqHeight); int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } /** * 压缩读取图片,这样不会内存溢出 * @param photpath * @return 压缩后的bitmap */ public static Bitmap ReadBitmap(String photpath,int reqWidth,int reqHeight){ BitmapFactory.Options options = new BitmapFactory.Options(); //根据图片路径读取图片,获取图片大小,但不读入到内存 options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(photpath,options); // 此时返回bm为空 //计算缩放比例 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 重新读入图片,并在内存中生成压缩后的bitmap options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(photpath, options); return bitmap; } /** * 根据图片文件Uri得到其真实路径; * @param context * @param uri * @return */ public static String getPhotoPath(Activity context,Uri uri){ //获取录音文件真实路径 String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); return filePath; } /** * 放大缩小图片 * @param bm 图片源 * @param newWidth 类型为dp或dip * @param newHeight 类型为dp或dip * @return */ public static Bitmap zoomBitmap(Context context,Bitmap bm, int newWidth, int newHeight) { // 图片源 // Bitmap bm = BitmapFactory.decodeStream(getResources() // .openRawResource(id)); // 获得图片的宽高 if(bm!=null){ int width = bm.getWidth(); int height = bm.getHeight(); // 设置想要的大小 int newWidth1 =UIUtil.dip2px(context,newWidth); int newHeight1 =UIUtil.dip2px(context,newHeight); // 计算缩放比例 float scaleWidth = ((float) newWidth1) / width; float scaleHeight = ((float) newHeight1) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); return newbm; } return null; } /** * 根据图片实际角度,旋转图片 * @param photpath 图片实际路径 * @param bm 要旋转的图片 * @return */ public static Bitmap RotateBitmap(String photpath,Bitmap bm){ ExifInterface exifInterface=null; try { exifInterface = new ExifInterface(photpath); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } int tag = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); int degree = 0; if (tag == ExifInterface.ORIENTATION_ROTATE_90) { degree = 90; } else if (tag == ExifInterface.ORIENTATION_ROTATE_180) { degree = 180; } else if (tag == ExifInterface.ORIENTATION_ROTATE_270) { degree = 270; } return RotateBitmap(degree,bm); } /** * 根据输入旋转角度,旋转图片 * @param degree 旋转角度 * @param bm 要旋转的图片 * @return */ public static Bitmap RotateBitmap(int degree,Bitmap bm){ Matrix m=new Matrix(); if (degree != 0 && bm != null) { m.setRotate(degree, (float) bm.getWidth() / 2,(float) bm.getHeight() / 2); } //旋转图片 if(bm!=null){ return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); } return null; } /** * 根据图片数据项显示图片 * @param context * @param Color_Display * @param photo * @param width 类型为dp或dip * @param height 类型为dp或dip */ public static void showPicture(Context context,ImageView Color_Display,AccessoryDTO photo,int width,int height){ //显示图片 if(!TextUtils.isEmpty(photo.getPath())){ //压缩读取图片,否走读取大图时会内存溢出 Bitmap bmp1=ReadBitmap(photo.getPath(),150,200); //旋转图片 Bitmap bmp2 = RotateBitmap(photo.getPath(),bmp1); //缩放图片 Bitmap bmp3 =zoomBitmap(context,bmp2,width,height); //显示图片 Color_Display.setImageBitmap(bmp3); //bmp3.recycle(); if(bmp2!=null){ bmp2.recycle(); } if(bmp1!=null){ bmp1.recycle(); } }else{ Color_Display.setImageBitmap(null); Color_Display.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.bg_transparent_tile)); } } }