| package com.doumee.lib_coremodel.util.luban; | 
|   | 
| import android.graphics.Bitmap; | 
| import android.graphics.BitmapFactory; | 
| import android.graphics.Matrix; | 
|   | 
| import java.io.ByteArrayOutputStream; | 
| import java.io.File; | 
| import java.io.FileOutputStream; | 
| import java.io.IOException; | 
|   | 
| /** | 
|  * Responsible for starting compress and managing active and cached resources. | 
|  */ | 
| class Engine { | 
|   private InputStreamProvider srcImg; | 
|   private File tagImg; | 
|   private int srcWidth; | 
|   private int srcHeight; | 
|   private boolean focusAlpha; | 
|   | 
|   Engine(InputStreamProvider srcImg, File tagImg, boolean focusAlpha) throws IOException { | 
|     this.tagImg = tagImg; | 
|     this.srcImg = srcImg; | 
|     this.focusAlpha = focusAlpha; | 
|   | 
|     BitmapFactory.Options options = new BitmapFactory.Options(); | 
|     options.inJustDecodeBounds = true; | 
|     options.inSampleSize = 1; | 
|   | 
|     BitmapFactory.decodeStream(srcImg.open(), null, options); | 
|     this.srcWidth = options.outWidth; | 
|     this.srcHeight = options.outHeight; | 
|   } | 
|   | 
|   private int computeSize() { | 
|     srcWidth = srcWidth % 2 == 1 ? srcWidth + 1 : srcWidth; | 
|     srcHeight = srcHeight % 2 == 1 ? srcHeight + 1 : srcHeight; | 
|   | 
|     int longSide = Math.max(srcWidth, srcHeight); | 
|     int shortSide = Math.min(srcWidth, srcHeight); | 
|   | 
|     float scale = ((float) shortSide / longSide); | 
|     if (scale <= 1 && scale > 0.5625) { | 
|       if (longSide < 1664) { | 
|         return 1; | 
|       } else if (longSide < 4990) { | 
|         return 2; | 
|       } else if (longSide > 4990 && longSide < 10240) { | 
|         return 4; | 
|       } else { | 
|         return longSide / 1280 == 0 ? 1 : longSide / 1280; | 
|       } | 
|     } else if (scale <= 0.5625 && scale > 0.5) { | 
|       return longSide / 1280 == 0 ? 1 : longSide / 1280; | 
|     } else { | 
|       return (int) Math.ceil(longSide / (1280.0 / scale)); | 
|     } | 
|   } | 
|   | 
|   private Bitmap rotatingImage(Bitmap bitmap, int angle) { | 
|     Matrix matrix = new Matrix(); | 
|   | 
|     matrix.postRotate(angle); | 
|   | 
|     return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); | 
|   } | 
|   | 
|   File compress() throws IOException { | 
|     BitmapFactory.Options options = new BitmapFactory.Options(); | 
|     options.inSampleSize = computeSize(); | 
|   | 
|     Bitmap tagBitmap = BitmapFactory.decodeStream(srcImg.open(), null, options); | 
|     ByteArrayOutputStream stream = new ByteArrayOutputStream(); | 
|   | 
|     if (Checker.SINGLE.isJPG(srcImg.open())) { | 
|       tagBitmap = rotatingImage(tagBitmap, Checker.SINGLE.getOrientation(srcImg.open())); | 
|     } | 
|     tagBitmap.compress(focusAlpha ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, 60, stream); | 
|     tagBitmap.recycle(); | 
|   | 
|     FileOutputStream fos = new FileOutputStream(tagImg); | 
|     fos.write(stream.toByteArray()); | 
|     fos.flush(); | 
|     fos.close(); | 
|     stream.close(); | 
|   | 
|     return tagImg; | 
|   } | 
| } |