android 图片裁剪,显示 指定压缩

这段时间处理图片清晰度问题,这里统一做一个整理!

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);
}
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();
    }

}


图片切割其实最需要注意的地方就是需要根据uri获取图片数据,不要直接返回bitmap。将url对应的bitmap做大小压缩处理。

此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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值