Android之图片压缩和Uri与String类型的路径转换,获取图片,文件大小的工具类:

图片压缩和路径转换,获取图片,文件大小的工具类:

  • 知道图片路径 Uri 转换为 String 路径
  • 对图片进行压缩并且命名存储到指定的路径targetPath
  • 根据路径获得图片信息并按比例压缩,返回bitmap
  • 调用此方法自动计算指定文件或指定文件夹的大小
  • 获取指定文件大小
  • 转换文件大小
  • 旋转照片
  • 将图片路径Uri所表示的图片转换成指定大小的照片显示出来
  • 获取bitmap的大小

知道图片路径 Uri 转换为 String 路径

/**
     * Try to return the absolute file path from the given Uri
     * @param context   知道图片路径 Uri 转换为 String 路径            TODO
     * @param uri
     * @return the file path or null
    *
    *Uri获取String类型的绝对路径
    *String path = Uri.getPath();
     */
    public static String getRealFilePath( final Context context, final Uri uri ) {
        if ( null == uri ) return null;
        final String scheme = uri.getScheme();
        String data = null;
        if ( scheme == null )
            data = uri.getPath();
        else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
            data = uri.getPath();
        } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
            Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
            if ( null != cursor ) {
                if ( cursor.moveToFirst() ) {
                    int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
                    if ( index > -1 ) {
                        data = cursor.getString( index );
                    }
                }
                cursor.close();
            }
        }
        return data;
    }

对图片进行压缩并且命名存储到指定的路径targetPath

/**
 * 对图片进行压缩命名存储到指定的路径path
 * @param filePath  原图片路径
 * @param targetPath  存储图片目标路径
 * @param quality  图片质量  1-100
 * @return
 */
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){}
    return outputFile.getPath();
}

根据路径获得图片信息并按比例压缩,返回bitmap

/**
 * 根据路径获得图片信息并按比例压缩,返回bitmap
 */
public static Bitmap getSmallBitmap(String filePath) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;//只解析图片边沿,获取宽高
    BitmapFactory.decodeFile(filePath, options);
    // 计算缩放比
    options.inSampleSize = calculateInSampleSize(options, 480, 800);
    // 完整解析图片返回bitmap
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(filePath, options);
}

调用此方法自动计算指定文件或指定文件夹的大小

/**
     * 调用此方法自动计算指定文件或指定文件夹的大小
     * @param filePath 文件路径
     * @return 计算好的带B、KB、MB、GB的字符串
     */
    public static String getAutoFileOrFilesSize(String filePath){
        File file=new File(filePath);
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFileSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("获取文件大小","获取失败!");
        }
        return FormetFileSize(blockSize);
    }

获取指定文件大小

/**
     * 获取指定文件大小
     * @param
     * @return
     * @throws Exception
     */
    private static long getFileSize(File file) throws Exception
    {
        long size = 0;
        if (file.exists()){
            FileInputStream fis = null;
            fis = new FileInputStream(file);
            size = fis.available();
        }
        else{
            file.createNewFile();
            Log.e("获取文件大小","文件不存在!");
        }
        return size;
    }

转换文件大小

/**
 * 转换文件大小
 * @param fileS
 * @return
 */
private static String FormetFileSize(long fileS)
{
    DecimalFormat df = new DecimalFormat("#.00");
    String fileSizeString = "";
    String wrongSize="0B";
    if(fileS==0){
        return wrongSize;
    }
    if (fileS < 1024){
        fileSizeString = df.format((double) fileS) + "B";
    }
    else if (fileS < 1048576){
        fileSizeString = df.format((double) fileS / 1024) + "KB";
    }
    else if (fileS < 1073741824){
        fileSizeString = df.format((double) fileS / 1048576) + "MB";
    }
    else{
        fileSizeString = df.format((double) fileS / 1073741824) + "GB";
    }
    return fileSizeString;
}

旋转照片

/**
 * 旋转照片
 * @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;
}

将图片路径Uri所表示的图片转换成指定大小的照片显示出来

 /**
  * 将图片路径Uri所表示的图片转换成指定大小的照片显示出来
  */
public static Bitmap getThumbnail(Context mContext, Uri uri, int reqWidth, int reqHeight) {
    Bitmap srcBmp = BitmapUtils.decodeSampledFromUri(mContext, uri, reqWidth, reqHeight);
    // If picture is smaller than required thumbnail
    Bitmap dstBmp;
    if (srcBmp.getWidth() < reqWidth && srcBmp.getHeight() < reqHeight) {
        dstBmp = ThumbnailUtils.extractThumbnail(srcBmp, reqWidth, reqHeight);
        // Otherwise the ratio between measures is calculated to fit requested thumbnail's one
    } else {
        int x = 0, y = 0, width = srcBmp.getWidth(), height = srcBmp.getHeight();
        float ratio = ((float) reqWidth / (float) reqHeight) * ((float) srcBmp.getHeight() / (float) srcBmp.getWidth());
        if (ratio < 1) {
            x = (int) (srcBmp.getWidth() - srcBmp.getWidth() * ratio) / 2;
            width = (int) (srcBmp.getWidth() * ratio);
        } else {
            y = (int) (srcBmp.getHeight() - srcBmp.getHeight() / ratio) / 2;
            height = (int) (srcBmp.getHeight() / ratio);
        }
        dstBmp = Bitmap.createBitmap(srcBmp, x, y, width, height);
    }
    return dstBmp;
}

获取bitmap的大小

//获取bitmap的大小
public static long getBitmapsize(Bitmap bitmap){

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
        return bitmap.getByteCount();
    }
    // Pre HC-MR1
    return bitmap.getRowBytes() * bitmap.getHeight();

}

通过压缩图片的尺寸来压缩图片大小

/**
 * 通过压缩图片的尺寸来压缩图片大小  TODO
 *
 * @param pathName     图片的完整路径
 * @param targetWidth  缩放的目标宽度
 * @param targetHeight 缩放的目标高度
 * @return 缩放后的图片
 */
public static Bitmap compressBySize(String pathName, int targetWidth,
                                    int targetHeight) {
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等;
    Bitmap bitmap1 = BitmapFactory.decodeFile(pathName, opts);
    // 得到图片的宽度、高度;
    int imgWidth = opts.outWidth;
    int imgHeight = opts.outHeight;
    // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数;
    int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth);
    int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight);
    if (widthRatio > 1 || widthRatio > 1) {
        if (widthRatio > heightRatio) {
            opts.inSampleSize = widthRatio;
        } else {
            opts.inSampleSize = heightRatio;
        }
    }
    // 设置好缩放比例后,加载图片进内容;
    opts.inJustDecodeBounds = false;
    bitmap1 = BitmapFactory.decodeFile(pathName, opts);
    return bitmap1;
}

从相册和拍照获取图片显示看以前的一篇博文。。。

你可能感兴趣的:(Android之图片压缩和Uri与String类型的路径转换,获取图片,文件大小的工具类:)