zoukankan      html  css  js  c++  java
  • BitmapUtil(高效压缩不失真)

    package com.changim.patient.app.utils;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.net.Uri;
    import android.provider.MediaStore;
    import android.view.Gravity;
    import android.widget.Toast;
    
    import java.io.File;
    
    /**
     * Created by zzw on 2016/2/23 0023.
     */
    public class ImageUtils {
    
        /**
         * 根据图片的Uri得到它的路径
         *
         * @param activity
         * @param imageUri
         * @return 返回null表示不能找到此图片
         */
        public static String getImagePathFromImageUri(Activity activity, Uri imageUri) {
    
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = activity.getContentResolver().query(imageUri, filePathColumn, null, null, null);
    
            if (cursor != null) {
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String imagePath = cursor.getString(columnIndex);
                cursor.close();
    
                if (imagePath == null || imagePath.equals("null")) {
                    Toast toast = Toast.makeText(activity, "不能发现图片", Toast.LENGTH_SHORT);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                }
    
                return imagePath;
            } else {
                File file = new File(imageUri.getPath());
                if (!file.exists()) {
                    Toast toast = Toast.makeText(activity, "不能发现图片", Toast.LENGTH_SHORT);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    return null;
                }
                return file.getAbsolutePath();
            }
        }
    
        /**
         * 根据图片的路径得到图片资源(压缩后)
         * 如果targetW或者targetH为0就自动压缩
         *
         * @param path
         * @param
         * @return 压缩后的图片
         */
        public static Bitmap getYaSuoBitmapFromImagePath(String path, int targetW, int targetH) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, options);
            int height = options.outHeight;
            int width = options.outWidth;
            int inSampleSize = calculateInSampleSize(options);
            options.inSampleSize = inSampleSize;
            options.inJustDecodeBounds = false;
            Bitmap src = BitmapFactory.decodeFile(path, options);
    
            if (src == null) {
                return null;
            }
            Bitmap bitmap = null;
    
            if (targetH == 0 || targetW == 0) {
                bitmap = Bitmap.createScaledBitmap(src, width / inSampleSize, height / inSampleSize, false);
            } else {
                bitmap = Bitmap.createScaledBitmap(src, targetW, targetH, false);
            }
    
            if (src != bitmap) {
                src.recycle();
            }
    
            return bitmap;
        }
    
        /**
         * 计算压缩比
         *
         * @param options
         * @return
         */
        public static int calculateInSampleSize(BitmapFactory.Options options) {
            int height = options.outHeight;
            int width = options.outWidth;
    
            int min = height > width ? width : height;
            int inSampleSize = min / 400;
    
            if (inSampleSize == 0)
    
                return 1;
    
            return inSampleSize;
        }
    
    
        /**
         * 根据图片的路径得到该图片在表中的ID
         *
         * @param cr
         * @param fileName
         * @return
         */
        public static String getImageIdFromPath(ContentResolver cr, String fileName) {
    
            //select condition.
            String whereClause = MediaStore.Images.Media.DATA + " = '" + fileName + "'";
    
            //colection of results.
            Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, whereClause, null, null);
            if (cursor == null || cursor.getCount() == 0) {
                if (cursor != null)
                    cursor.close();
                return null;
            }
            cursor.moveToFirst();
            //imageView id in imageView table.
            String imageId = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
            cursor.close();
            if (imageId == null) {
                return null;
            }
            return imageId;
        }
    
        /**
         * 根据图片的ID得到缩略图
         *
         * @param cr
         * @param imageId
         * @return
         */
        public static Bitmap getThumbnailsFromImageId(ContentResolver cr, String imageId) {
            if (imageId == null || imageId.equals(""))
                return null;
    
            Bitmap bitmap = null;
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inDither = false;
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    
            long imageIdLong = Long.parseLong(imageId);
            //via imageid get the bimap type thumbnail in thumbnail table.
            bitmap = MediaStore.Images.Thumbnails.getThumbnail(cr, imageIdLong, MediaStore.Images.Thumbnails.MINI_KIND, options);
    
            return bitmap;
        }
    
        /**
         * 获得圆角图片的方法
         *
         * @param bitmap 源Bitmap
         * @param roundPx 圆角大小
         * @return 期望Bitmap
         */
        public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
    
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                    bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
    
            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            final RectF rectF = new RectF(rect);
    
            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(color);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);
    
            return output;
        }
    }
  • 相关阅读:
    LINUX用户管理——/etc/passwd文件详解
    接口类型的问题:信息丢失
    swift是强类型语言
    swift的多态
    面向对象的本质:基于对象+面向接口+继承
    多态的本质:同一函数接口在接受不同的类型参量时表现出不同的行为--多态是面向接口编程
    类型约束的本质是:类型构造器在约束类型的基础上构造新的函数类型
    类型与函数:函数是一种复合类型,它的构建依赖于数据类型
    类型约束的语义学研究:基于类型约束的编程
    复合类型、类型约束、添加功能、高阶函数
  • 原文地址:https://www.cnblogs.com/zzw1994/p/5411640.html
Copyright © 2011-2022 走看看