Android Bitmap圖片縮放優化,用canvas替代Matrix進行縮放,解決一些錯我
阿新 • • 發佈:2019-02-20
前面用Matrix來縮放Bitmap,發現有些情況下會丟擲錯誤,導致圖片空白。
下面採用Cavans來縮放圖片,就不會有問題了。/** * 縮放 * * @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; // }
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; }