Android -- 超全的 File,Bitmap,Uri, FilePath 之间的转换方法

1.文件(path)转Bitmap

    File file = new File(filePath);
    Uri uri = Uri.fromFile(file);
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);

    Bitmap loadbitmap = BitmapFactory.decodeFile(file);
    /*同类型的还有 
    BitmapFactory.decodeStream(InputStream inputStream);
    BitmapFactory.decodeResource();
    BitmapFactory.decodeByteArray();
    BitmapFactory.decodeFileDescriptor();...
    */

或 先压缩,再转

    Bitmap loadbitmap = BitmapFactory.decodeFile(imagePath, getBitmapOption(2));
    private BitmapFactory.Options getBitmapOption(int inSampleSize)
    {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPurgeable = true;
        options.inSampleSize = inSampleSize;
        return options;
    }

2.Bitmap 转 文件

    public void saveBitmapFile(Bitmap bitmap) {
        File file = new File(filePath);//将要保存图片的路径
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
            bos.flush();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.Uri 转 File

    /**
     * uri 转 File
     */
    public File uriTurnFile(Uri uri) {

        return new File(uri.getPath());

    }

4.File 转 Uri

    /**
     * File 转 Uri
     */
    public Uri fileTurnUri(File file) {
        return  Uri.fromFile(file);
    }

5.url路径 转 Bitmap(加载网络图片)

    /**
     * 根据url路径 转bitmap
     *
     * @param urlpath
     * @return
     */
    public Bitmap getBitmap(String urlpath) {

        Bitmap map = null;
        try {
            URL url = new URL(urlpath);
            URLConnection conn = url.openConnection();
            conn.connect();
            InputStream in;
            in = conn.getInputStream();
            map = BitmapFactory.decodeStream(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return map;
    }

6.Uri 转 Bitmap

    //读取图片,并将图片缩放到指定的目标大小
    InputStream stream = getContentResolver().openInputStream(uri);
    Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
    stream.close();

Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);

7.Path 转 Uri

FilePath 转 FileUri

File f = new File(filePath);
Uri uri = Uri.fromFile(f);

FilePath 转 MediaUri

   public static Uri getMediaUriFromPath(Context context, String path) {
        Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = context.getContentResolver().query(mediaUri, null, 
                MediaStore.Images.Media.DISPLAY_NAME + "= ?",
                new String[] {path.substring(path.lastIndexOf("/") + 1)},
                null);

        Uri uri = null;
        if(cursor.moveToFirst()) {
            uri = ContentUris.withAppendedId(mediaUri,
                    cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
        }
        cursor.close();
        return uri;
    }

8.Uri 转 Path

    /**
     * 4.4之前
     * uri 转 path
     */
    public String getRealPathFromUri(Context context, Uri contentUri) {
        Cursor cursor = null;
        try { 
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}
    /**
     * android 4.4 及以后获取 uri 真实路径
     */
    public String getRealFilePath(Uri uri) {
        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 = mContext.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;
    }

或(这个覆盖面更广,前面的可能有些情况不行)

   private void handleImageBeforeKitKat(Uri uri) {
        String imagePath = getImagePath(uri, null);
    }



    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void handleImageOnKitKat(Uri uri) {
        String imagePath = null;
        if (DocumentsContract.isDocumentUri(this, uri)) {
            //如果是Document类型的Uri,则通过document id处理
            String docId = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docId.split(":")[1];//解析出数字格式的id
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);

            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                imagePath = getImagePath(contentUri, null);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            //如果是content类型的uri,使用普通方式处理
            imagePath = getImagePath(uri, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            //如果是file类型的Uri,直接获取图片路径
            imagePath = uri.getPath();
        }

    }


    private String getImagePath(Uri uri, String selection) {
        String path = null;
        //通过Uri和selection来获取真实的图片路径
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }
    (摘自第一行代码)

大部分来源于写过的代码,第八点部分来源于网络及书本。

猜你喜欢

转载自blog.csdn.net/wyg1230/article/details/79153641
今日推荐