package com.luck.picture.lib.compress;
|
|
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 static final int DEFAULT_QUALITY = 60;
|
private int compressQuality;
|
private InputStreamProvider srcImg;
|
private File tagImg;
|
private int srcWidth;
|
private int srcHeight;
|
private boolean focusAlpha;
|
|
Engine(InputStreamProvider srcImg, File tagImg, boolean focusAlpha, int compressQuality) throws IOException {
|
this.tagImg = tagImg;
|
this.srcImg = srcImg;
|
this.focusAlpha = focusAlpha;
|
this.compressQuality = compressQuality <= 0 ? DEFAULT_QUALITY : compressQuality;
|
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()));
|
}
|
if (tagBitmap != null) {
|
if (compressQuality > 100) {
|
compressQuality = DEFAULT_QUALITY;
|
}
|
tagBitmap.compress(focusAlpha ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG,
|
compressQuality <= 0 ? DEFAULT_QUALITY : compressQuality, stream);
|
tagBitmap.recycle();
|
}
|
FileOutputStream fos = new FileOutputStream(tagImg);
|
fos.write(stream.toByteArray());
|
fos.flush();
|
fos.close();
|
stream.close();
|
|
return tagImg;
|
}
|
}
|