很實用的android壓縮圖片的演算法
這些天一直為android程式如何壓縮圖片煩惱,上網找了很多資料,整理了一下,經過測試,都是可用的,
放大或縮小圖片:
在圖片上印字:
建立logo(給圖片加水印), :
產生一個4位隨機數字的圖片驗證碼:
- /**
- * 壓縮圖片
- * @param bitmap 源圖片
- * @param width 想要的寬度
- * @param height 想要的高度
- * @param isAdjust 是否自動調整尺寸, true圖片就不會拉伸,false嚴格按照你的尺寸壓縮
- * @return Bitmap
- */
- public Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {
- // 如果想要的寬度和高度都比源圖片小,就不壓縮了,直接返回原圖
- if (bitmap.getWidth() < width && bitmap.getHeight() < height) {return bitmap;}
- // 根據想要的尺寸精確計算壓縮比例, 方法詳解:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode);
- // scale表示要保留的小數位, roundingMode表示如何處理多餘的小數位,BigDecimal.ROUND_DOWN表示自動捨棄
- float sx = new BigDecimal(width).divide(new BigDecimal(bitmap.getWidth()), 4, BigDecimal.ROUND_DOWN).floatValue();
- float sy = new BigDecimal(height).divide(new BigDecimal(bitmap.getHeight()), 4, BigDecimal.ROUND_DOWN).floatValue();
- if (isAdjust) {// 如果想自動調整比例,不至於圖片會拉伸
- sx = (sx < sy ? sx : sy);sy = sx;// 哪個比例小一點,就用哪個比例
- }
- Matrix matrix = new Matrix();
- matrix.postScale(sx, sy);// 呼叫api中的方法進行壓縮,就大功告成了
- return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- }
旋轉圖片:
- /**
- * 旋轉圖片
- * @param bitmap 源圖片
- * @param angle 旋轉角度(90為順時針旋轉,-90為逆時針旋轉)
- * @return Bitmap
- */
- public Bitmap rotate(Bitmap bitmap, float angle) {
- Matrix matrix = new Matrix();
- matrix.postRotate(angle);
- return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- }
放大或縮小圖片:
- /**
- * 放大或縮小圖片
- * @param bitmap 源圖片
- * @param ratio 放大或縮小的倍數,大於1表示放大,小於1表示縮小
- * @return Bitmap
- */
- public Bitmap zoom(Bitmap bitmap, float ratio) {
- if (ratio < 0f) {return bitmap;}
- Matrix matrix = new Matrix();
- matrix.postScale(ratio, ratio);
- return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- }
在圖片上印字:
- /**
- * 在圖片上印字
- * @param bitmap 源圖片
- * @param text 印上去的字
- * @param param 字型引數分別為:顏色,大小,是否加粗,起點x,起點y; 比如:{color : 0xFF000000, size : 30, bold : true, x : 20, y : 20}
- * @return Bitmap
- */
- public Bitmap printWord(Bitmap bitmap, String text, Map<String, Object> param) {
- if (ToolUtil.get().isBlank(text) || null == param) {return bitmap;}
- Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
- Canvas canvas = new Canvas(newBitmap);
- canvas.drawBitmap(bitmap, 0, 0, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- Paint paint = new Paint();
- paint.setColor(null != param.get("color") ? (Integer) param.get("color") : Color.BLACK);
- paint.setTextSize(null != param.get("size") ? (Integer) param.get("size") : 20);
- paint.setFakeBoldText(null != param.get("bold") ? (Boolean) param.get("bold") : false);
- canvas.drawText(text, null != param.get("x") ? (Integer) param.get("x") : 0, null != param.get("y") ? (Integer) param.get("y") : 0, paint);
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- return newBitmap;
- }
建立logo(給圖片加水印), :
- /**
- * 建立logo(給圖片加水印),
- * @param bitmaps 原圖片和水印圖片
- * @param left 左邊起點座標
- * @param top 頂部起點座標t
- * @return Bitmap
- */
- public Bitmap createLogo(Bitmap[] bitmaps, int left, int top) {
- Bitmap newBitmap = Bitmap.createBitmap(bitmaps[0].getWidth(), bitmaps[0].getHeight(), Config.ARGB_8888);
- Canvas canvas = new Canvas(newBitmap);
- for (int i = 0; i < bitmaps.length; i++) {
- if (i == 0) {
- canvas.drawBitmap(bitmaps[0], 0, 0, null);
- } else {
- canvas.drawBitmap(bitmaps[i], left, top, null);
- }
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- }
- return newBitmap;
- }
- private int width = 140, height = 40, codeLen = 4;
- private String checkCode = "";
- private Random random = new Random();
- /**
- * 產生一個4位隨機數字的圖片驗證碼
- * @return Bitmap
- */
- public Bitmap createCode() {
- checkCode = "";
- String[] chars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
- for (int i = 0; i < codeLen; i++) {checkCode += chars[random.nextInt(chars.length)];}
- Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);canvas.drawColor(Color.WHITE);
- Paint paint = new Paint();paint.setTextSize(30);paint.setColor(Color.BLUE);
- for (int i = 0; i < checkCode.length(); i++) {
- paint.setColor(randomColor(1));paint.setFakeBoldText(random.nextBoolean());
- float skewX = random.nextInt(11) / 10;
- paint.setTextSkewX(random.nextBoolean() ? skewX : -skewX);
- int x = width / codeLen * i + random.nextInt(10);
- canvas.drawText(String.valueOf(checkCode.charAt(i)), x, 28, paint);
- }
- for (int i = 0; i < 3; i++) {drawLine(canvas, paint);}
- for (int i = 0; i < 255; i++) {drawPoints(canvas, paint);}
- canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();
- return bitmap;
- }
- /**
- * 獲得一個隨機的顏色
- * @param rate
- * @return
- */
- public int randomColor(int rate) {
- int red = random.nextInt(256) / rate, green = random.nextInt(256) / rate, blue = random.nextInt(256) / rate;
- return Color.rgb(red, green, blue);
- }
- /**
- * 畫隨機線條
- * @param canvas
- * @param paint
- */
- public void drawLine(Canvas canvas, Paint paint) {
- int startX = random.nextInt(width), startY = random.nextInt(height);
- int stopX = random.nextInt(width), stopY = random.nextInt(height);
- paint.setStrokeWidth(1);paint.setColor(randomColor(1));
- canvas.drawLine(startX, startY, stopX, stopY, paint);
- }
- /**
- * 畫隨機干擾點
- * @param canvas
- * @param paint
- */
- public void drawPoints(Canvas canvas, Paint paint) {
- int stopX = random.nextInt(width), stopY = random.nextInt(height);
- paint.setStrokeWidth(1);
- paint.setColor(randomColor(1));
- canvas.drawPoint(stopX, stopY, paint);
- }
- /**
- * 返回真實驗證碼字串
- * @return String
- */
- public String getCheckCode() {
- return checkCode;
- }
相關文章
- 簡單實用的android 圖片的壓縮Android
- 圖片壓縮怎樣操作?分享幾種實用的批次圖片壓縮技巧
- 圖片壓縮不求人,3個親測實用高效的圖片壓縮神器
- android下圖片壓縮Android
- android圖片壓縮不失真實戰Android
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- Android壓縮圖片後再上傳圖片Android
- android 比較靠譜的圖片壓縮Android
- Android 載入大圖片,不壓縮圖片Android
- Flutter實現Luban圖片壓縮庫演算法Flutter演算法
- JNI實現圖片壓縮
- 圖片純前端JS壓縮的實現前端JS
- Android 中圖片壓縮分析(上)Android
- 一個強大的圖片壓縮演算法—近微信壓縮機制的Luban演算法
- Android-壓縮大圖到容量超小的圖片Android
- 前端圖片壓縮 - H5&Uni-App圖片壓縮前端H5APP
- 利用 canvas 實現圖片壓縮Canvas
- Android圖片壓縮實現過程及程式碼Android
- ??圖片壓縮CanvasCanvas
- IOS圖片壓縮iOS
- canvas 壓縮圖片Canvas
- Bitmap的圖片壓縮彙總
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- excel檔案裡的圖片怎麼壓縮?excel檔案裡圖片的壓縮方法Excel
- 如何壓縮word文件的大小,這個方法很實用
- 圖片壓縮演算法 3M壓縮到200K演算法
- 圖片壓縮知識梳理(0) 圖片壓縮學習計劃
- Android-圖片壓縮(二)-純乾貨Android
- 仿寫一個android圖片壓縮工具Android
- Android 圖片壓縮方法分析與學習Android
- iOS 圖片壓縮方法iOS
- 前端圖片壓縮方案前端
- 影像體積壓縮工具JPEG Jackal更好的壓縮圖片
- iOS開發中壓縮圖片的質量以及縮小圖片尺寸iOS
- layui中實現上傳圖片壓縮UI
- web前端實現圖片壓縮處理Web前端
- 純前端實現 JPG 圖片壓縮 | canvas前端Canvas
- Android微信分享圖片按質量壓縮的解決方案Android