很實用的android壓縮圖片的演算法

yangxi_001發表於2013-11-20
這些天一直為android程式如何壓縮圖片煩惱,上網找了很多資料,整理了一下,經過測試,都是可用的,
[java] view plaincopy
  1. /** 
  2.      * 壓縮圖片 
  3.      * @param bitmap 源圖片 
  4.      * @param width 想要的寬度 
  5.      * @param height 想要的高度 
  6.      * @param isAdjust 是否自動調整尺寸, true圖片就不會拉伸,false嚴格按照你的尺寸壓縮 
  7.      * @return Bitmap 
  8.      */  
  9.     public Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {  
  10.         // 如果想要的寬度和高度都比源圖片小,就不壓縮了,直接返回原圖  
  11.         if (bitmap.getWidth() < width && bitmap.getHeight() < height) {return bitmap;}  
  12.         // 根據想要的尺寸精確計算壓縮比例, 方法詳解:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode);  
  13.         // scale表示要保留的小數位, roundingMode表示如何處理多餘的小數位,BigDecimal.ROUND_DOWN表示自動捨棄  
  14.         float sx = new BigDecimal(width).divide(new BigDecimal(bitmap.getWidth()), 4, BigDecimal.ROUND_DOWN).floatValue();  
  15.         float sy = new BigDecimal(height).divide(new BigDecimal(bitmap.getHeight()), 4, BigDecimal.ROUND_DOWN).floatValue();  
  16.         if (isAdjust) {// 如果想自動調整比例,不至於圖片會拉伸  
  17.             sx = (sx < sy ? sx : sy);sy = sx;// 哪個比例小一點,就用哪個比例  
  18.         }  
  19.         Matrix matrix = new Matrix();  
  20.         matrix.postScale(sx, sy);// 呼叫api中的方法進行壓縮,就大功告成了  
  21.         return Bitmap.createBitmap(bitmap, 00, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
  22.     }  


旋轉圖片:

[java] view plaincopy
  1. /** 
  2.      * 旋轉圖片 
  3.      * @param bitmap 源圖片 
  4.      * @param angle 旋轉角度(90為順時針旋轉,-90為逆時針旋轉) 
  5.      * @return Bitmap 
  6.      */  
  7.     public Bitmap rotate(Bitmap bitmap, float angle) {  
  8.         Matrix matrix = new Matrix();    
  9.         matrix.postRotate(angle);  
  10.         return Bitmap.createBitmap(bitmap, 00, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
  11.     }  

放大或縮小圖片:
[java] view plaincopy
  1. /** 
  2.      * 放大或縮小圖片 
  3.      * @param bitmap 源圖片 
  4.      * @param ratio 放大或縮小的倍數,大於1表示放大,小於1表示縮小 
  5.      * @return Bitmap 
  6.      */  
  7.     public Bitmap zoom(Bitmap bitmap, float ratio) {  
  8.         if (ratio < 0f) {return bitmap;}  
  9.         Matrix matrix = new Matrix();  
  10.         matrix.postScale(ratio, ratio);  
  11.         return Bitmap.createBitmap(bitmap, 00, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
  12.     }  

在圖片上印字:

[java] view plaincopy
  1. /** 
  2.      * 在圖片上印字 
  3.      * @param bitmap 源圖片 
  4.      * @param text 印上去的字 
  5.      * @param param 字型引數分別為:顏色,大小,是否加粗,起點x,起點y; 比如:{color : 0xFF000000, size : 30, bold : true, x : 20, y : 20} 
  6.      * @return Bitmap 
  7.      */  
  8.     public Bitmap printWord(Bitmap bitmap, String text, Map<String, Object> param) {  
  9.         if (ToolUtil.get().isBlank(text) || null == param) {return bitmap;}  
  10.         Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
  11.         Canvas canvas = new Canvas(newBitmap);  
  12.         canvas.drawBitmap(bitmap, 00null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
  13.         Paint paint = new Paint();  
  14.         paint.setColor(null != param.get("color") ? (Integer) param.get("color") : Color.BLACK);  
  15.         paint.setTextSize(null != param.get("size") ? (Integer) param.get("size") : 20);  
  16.         paint.setFakeBoldText(null != param.get("bold") ? (Boolean) param.get("bold") : false);  
  17.         canvas.drawText(text, null != param.get("x") ? (Integer) param.get("x") : 0null != param.get("y") ? (Integer) param.get("y") : 0, paint);  
  18.         canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
  19.         return newBitmap;  
  20.     }  

建立logo(給圖片加水印), :
[java] view plaincopy
  1. /** 
  2.      * 建立logo(給圖片加水印),  
  3.      * @param bitmaps 原圖片和水印圖片 
  4.      * @param left 左邊起點座標 
  5.      * @param top 頂部起點座標t 
  6.      * @return Bitmap 
  7.      */  
  8.     public Bitmap createLogo(Bitmap[] bitmaps, int left, int top) {  
  9.         Bitmap newBitmap = Bitmap.createBitmap(bitmaps[0].getWidth(), bitmaps[0].getHeight(), Config.ARGB_8888);  
  10.         Canvas canvas = new Canvas(newBitmap);  
  11.         for (int i = 0; i < bitmaps.length; i++) {  
  12.             if (i == 0) {  
  13.                 canvas.drawBitmap(bitmaps[0], 00null);  
  14.             } else {  
  15.                 canvas.drawBitmap(bitmaps[i], left, top, null);  
  16.             }  
  17.             canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
  18.         }  
  19.         return newBitmap;  
  20.     }  
產生一個4位隨機數字的圖片驗證碼:

[java] view plaincopy
  1. private int width = 140, height = 40, codeLen = 4;  
  2.     private String checkCode = "";  
  3.     private Random random = new Random();  
  4.       
  5.     /** 
  6.      * 產生一個4位隨機數字的圖片驗證碼 
  7.      * @return Bitmap 
  8.      */  
  9.     public Bitmap createCode() {  
  10.         checkCode = "";  
  11.         String[] chars = { "0""1""2""3""4""5""6""7""8""9" };  
  12.         for (int i = 0; i < codeLen; i++) {checkCode += chars[random.nextInt(chars.length)];}  
  13.         Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
  14.         Canvas canvas = new Canvas(bitmap);canvas.drawColor(Color.WHITE);  
  15.         Paint paint = new Paint();paint.setTextSize(30);paint.setColor(Color.BLUE);  
  16.         for (int i = 0; i < checkCode.length(); i++) {  
  17.             paint.setColor(randomColor(1));paint.setFakeBoldText(random.nextBoolean());  
  18.             float skewX = random.nextInt(11) / 10;  
  19.             paint.setTextSkewX(random.nextBoolean() ? skewX : -skewX);  
  20.             int x = width / codeLen * i + random.nextInt(10);  
  21.             canvas.drawText(String.valueOf(checkCode.charAt(i)), x, 28, paint);  
  22.         }  
  23.         for (int i = 0; i < 3; i++) {drawLine(canvas, paint);}  
  24.         for (int i = 0; i < 255; i++) {drawPoints(canvas, paint);}  
  25.         canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
  26.         return bitmap;  
  27.     }  
  28.       
  29.     /** 
  30.      * 獲得一個隨機的顏色 
  31.      * @param rate 
  32.      * @return  
  33.      */  
  34.     public int randomColor(int rate) {  
  35.         int red = random.nextInt(256) / rate, green = random.nextInt(256) / rate, blue = random.nextInt(256) / rate;  
  36.         return Color.rgb(red, green, blue);  
  37.     }  
  38.   
  39.     /** 
  40.      * 畫隨機線條 
  41.      * @param canvas 
  42.      * @param paint 
  43.      */  
  44.     public void drawLine(Canvas canvas, Paint paint) {  
  45.         int startX = random.nextInt(width), startY = random.nextInt(height);  
  46.         int stopX = random.nextInt(width), stopY = random.nextInt(height);  
  47.         paint.setStrokeWidth(1);paint.setColor(randomColor(1));  
  48.         canvas.drawLine(startX, startY, stopX, stopY, paint);  
  49.     }  
  50.   
  51.     /** 
  52.      * 畫隨機干擾點 
  53.      * @param canvas 
  54.      * @param paint 
  55.      */  
  56.     public void drawPoints(Canvas canvas, Paint paint) {  
  57.         int stopX = random.nextInt(width), stopY = random.nextInt(height);  
  58.         paint.setStrokeWidth(1);  
  59.         paint.setColor(randomColor(1));  
  60.         canvas.drawPoint(stopX, stopY, paint);  
  61.     }  
  62.       
  63.     /** 
  64.      * 返回真實驗證碼字串 
  65.      * @return String 
  66.      */  
  67.     public String getCheckCode() {  
  68.         return checkCode;  
  69.     }  

相關文章