1. 程式人生 > >Android Bitmap圖片縮放優化,用canvas替代Matrix進行縮放,解決一些錯我

Android Bitmap圖片縮放優化,用canvas替代Matrix進行縮放,解決一些錯我

前面用Matrix來縮放Bitmap,發現有些情況下會丟擲錯誤,導致圖片空白。

    /**
     * 縮放
     *
     * @param bm
     * @param newWidth
     * @param newHeight
     * @return
     */
//    public synchronized static Bitmap scaleImage(boolean isApplyRadio,Bitmap bm, int newWidth, int newHeight) {
//
//        //應用圖示縮放
//        if(isApplyRadio&&iconScaleRadio!=1f){
//            newWidth= (int) (newWidth*iconScaleRadio);
//            newHeight= (int) (newHeight*iconScaleRadio);
//        }
//
//        if (bm == null) {
//            return null;
//        }
//        int width = bm.getWidth();
//        int height = bm.getHeight();
//        float scaleWidth = ((float) newWidth) / width;
//        float scaleHeight = ((float) newHeight) / height;
//        Matrix matrix = new Matrix();
//        matrix.postScale(scaleWidth, scaleHeight);
//        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
//        if (bm != null & !bm.isRecycled()) {
//            bm.recycle();
//            bm = null;
//        }
//        return newbm;
//    }
下面採用Cavans來縮放圖片,就不會有問題了。
 private  static PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
    public synchronized static Bitmap scaleImageCavans(boolean isApplyRadio,Bitmap bm, int newWidth, int newHeight) {
        //應用圖示縮放
        if(isApplyRadio&&iconScaleRadio!=1f){
            newWidth= (int) (newWidth*iconScaleRadio);
            newHeight= (int) (newHeight*iconScaleRadio);
        }
        if (bm == null) {
            return null;
        }
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Bitmap newbm = Bitmap.createBitmap(newWidth, newWidth,
                Bitmap.Config.ARGB_8888);
        mCanvas.setBitmap(newbm);
        mPaint.setXfermode(null);
        mPaint.setAntiAlias(true);
        mCanvas.save();
        mCanvas.scale(scaleWidth, scaleHeight);
        //保證圖示不失真
        mCanvas.setDrawFilter(pfd);
        mCanvas.drawBitmap(bm,0,0,null);
        mCanvas.restore();
        if (bm != null & !bm.isRecycled()) {
            bm.recycle();
            bm = null;
        }
        return newbm;
    }