这段时间处理图片清晰度问题,这里统一做一个整理!
1.调用系统做图片切割
AppImageManager.totlaMemory = getTotalMemory(context);
/** * 裁剪图片方法实现 * * @param uri */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 if(AppImageManager.totlaMemory<=1024){ intent.putExtra("outputX", 500); intent.putExtra("outputY", 500); }else if(AppImageManager.totlaMemory > 1024){ intent.putExtra("outputX", 1100); intent.putExtra("outputY", 1100); } intent.putExtra("return-data", false); intent.putExtra("noFaceDetection", true); // no face detection 人脸识别 intent.putExtra(MediaStore.EXTRA_OUTPUT, getUri()); Log.debug("", "currentDays startPhotoZoom....."); startActivityForResult(intent, GETPIC_OK); } public Uri getUri() { File file = new File(Environment.getExternalStorageDirectory(), ClientConfig.UPLOAD_IMG_PATH); if (!file.exists()) { // 创建目录 file.mkdirs(); } String name = System.currentTimeMillis() + ".jpg"; File file1 = new File(file, name); imagePath = file1.getAbsolutePath(); return Uri.fromFile(file1); }
图片切割其实最需要注意的地方就是需要根据uri获取图片数据,不要直接返回bitmap。将url对应的bitmap做大小压缩处理。public static long getTotalMemory(Context context){//获取系统内存总数 String str1 = "/proc/meminfo";// 系统内存信息文件 String str2; String[] arrayOfString; long initial_memory = 0; try { FileReader localFileReader = new FileReader(str1); BufferedReader localBufferedReader = new BufferedReader( localFileReader, 8192); str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小 arrayOfString = str2.split("\\s+"); initial_memory = Integer.valueOf(arrayOfString[1]).intValue()/1024 ;// 获得系统总内存,单位是KB,乘以1024转换为Byte localBufferedReader.close(); } catch (IOException e) { } return initial_memory; }/*** 获取图片uri后,取得图片路径,指定大小maxSize(单位kb),做大小压缩,不改变质量*/public void compressImage(String imgFileName, int maxSize) { Bitmap image = FDBitmapUtil.decodeFile(imgFileName, 1000); FDFileUtil.deleteFile(new File(imgFileName), this.activity); ByteArrayOutputStream baos = new ByteArrayOutputStream();//100是质量参数,越小越模糊 image.compress(CompressFormat.JPEG, 100, baos); for(float options = 90.0F; baos.toByteArray().length / 1024 > maxSize && options > 10.0F; options -= 10.0F) { baos.reset(); image.compress(CompressFormat.JPEG, (int)options, baos); } FDDebug.d("压缩后大小 " + baos.toByteArray().length / 1024); try { FileOutputStream e = new FileOutputStream(new File(imgFileName)); e.write(baos.toByteArray()); e.flush(); e.close(); } catch (FileNotFoundException var7) { var7.printStackTrace(); } catch (IOException var8) { var8.printStackTrace(); } }
此bitmap保存到本地后,不要直接加载bitmap做文件上传,而是只接操作文件流,做文件大图上传。
public static byte[] readFileToByteArray(File file) throws IOException { FileInputStream in = null; byte[] var2; try { in = openInputStream(file); var2 = IOUtils.toByteArray(in); } finally {
//close in //IOUtils.closeQuietly(in); } return var2; }