Android bitmap 一些常用用法

说到Bitmap,Android 的朋友肯定很熟悉了,下面是我对bitmap一些常用方法的总结。之后会陆续更新。

圆角bitmap


    /**
     * 
     * @param source 
     * @param radius 圆角半径
     * @return
     */

public static Bitmap getRoundCornerBitmap(Bitmap source, float radius) {
        if (source == null) return null;
        if(radius <= 0){
            return source;
        }
        Bitmap result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

读取Asset图片

public static Bitmap getImageFromAssetsFile(String fileName, Context context){
        Bitmap image = null;
        AssetManager am = context.getResources().getAssets();
        InputStream is = null;
        try {
            is = am.open(fileName);
            image = BitmapFactory.decodeStream(is);
            is.close();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return image;
    }

缩放图片

 public static Bitmap scaleBitmap(Bitmap bitmap, int dstWidth, int dstHeight) {
        if(bitmap == null){
            return null;
        }
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scaleWidth = ((float) dstWidth) / width;
        float scaleHeight = ((float) dstHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap newbm = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        return newbm;
    }

读取图片
sampleSize 是指采样率,比如读取原图,sample为1,比如你要读取的图片宽高是原图的1/2,则sampleSize=2,合理使用sampleSize能有效节省内存,比如原图宽高为1080x1920, 而实际只需要显示在108x192的imageview上,最暴力的方法,直接读取原图,但这样很容易oom,或者读取原图,然后放缩到指定尺寸,这个过程也会消耗大量内存,而按照下面的方法,只需要设置sampleSize=10就可以了。

public static Bitmap getBitmapWithPath(String path, int sampleSize){
        if(TextUtils.isEmpty(path)){
            return null;
        }
        if(sampleSize <= 0){
            sampleSize = 1;
        }
        File file = new File(path);
        if(file.exists() && file.isFile()) {
            BitmapFactory.Options boundOptions = new BitmapFactory.Options();
            boundOptions.inJustDecodeBounds = false;
            boundOptions.inSampleSize = sampleSize;
            boundOptions.inDither = true;
            boundOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
            return BitmapFactory.decodeFile(path, boundOptions);
        }
        return null;
    }

所以读取一个图片的时候最好的流程这样:读取图片大小(见下述代码)–>计算缩放比例–>读取指定大小的图片(见上述代码)

读取图片大小

 public static Size getBitmapBoundWithPath(String path){
        InputStream input = null;
        try {
            input = new FileInputStream(path);
            if(input == null){
                return null;
            }
            BitmapFactory.Options boundOptions = new BitmapFactory.Options();
            boundOptions.inJustDecodeBounds = true;
            boundOptions.inSampleSize = 1;
            BitmapFactory.decodeStream(input, null, boundOptions);//只取宽高,节省内存
            input.close();
            return new Size(boundOptions.outWidth, boundOptions.outHeight);
        } catch (Exception e) {
            Log.d(TAG, "exception:" + e.getMessage());
            return null;
        }finally {
            if(input != null){
                try {
                    input.close();
                } catch (IOException e) {
                    Log.d(TAG, "exception:" + e.getMessage());
                    return null;
                }
            }
        }
    }

从视频中获取帧
下面的代码并不能兼容所有的Android机器,比如华为P10用下面方法截帧是不靠谱的。

/**
     * 
     * @param path
     * @param time 毫秒
     * @return
     */
 public static Bitmap getFrameFromVideo(String path, long time){
        try {
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            retriever.setDataSource(path);
            String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
            long duration = Integer.valueOf(durationStr);
            if(time > duration || time < 0){
                return null;
            }
            Bitmap bitmap = retriever.getFrameAtTime(time * 1000);
            return bitmap;
        }catch (Exception e){
            return null;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值