ソースを参照

图片压缩的问题

詹子聪 5 年 前
コミット
153fc62633

+ 1 - 1
app/build.gradle

@@ -79,7 +79,7 @@ dependencies {
     //implementation 'com.github.VictorAlbertos:RxActivityResult:0.5.0-2.x'
 
     // 图片压缩
-    //implementation 'id.zelory:compressor:2.1.0'
+    implementation 'id.zelory:compressor:2.1.0'
     implementation 'top.zibin:Luban:1.1.8'
     //compile 'me.shaohui.advancedluban:library:1.3.5'
 

+ 36 - 15
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import id.zelory.compressor.Compressor;
 import io.reactivex.Observable;
 import io.reactivex.ObservableEmitter;
 import io.reactivex.ObservableOnSubscribe;
@@ -80,11 +81,11 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
 
                     int max = rotatedBitmap.getWidth() > rotatedBitmap.getHeight() ? rotatedBitmap.getWidth() : rotatedBitmap.getHeight();
                     float multi = 1.0f;
-                    if (max > 2000) {
-                        multi = 1.0f * max / 2000 + 0.4f;
-                    }
+//                    if (max > 2000) {
+//                        multi = 1.0f * max / 2000 + 0.4f;
+//                    }
 
-                    if (multi > 1) {
+                    if (multi >= 1) {
                         File file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES) + "/" + System.currentTimeMillis() + ".jpg");
                         if (!file.getParentFile().exists()) {
                             file.getParentFile().mkdirs();
@@ -95,25 +96,38 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
 
                         rotatedBitmap.recycle();
                         if (saveCropSuccess) {
-                            List<File> fileList = Luban.with(context)
-                                    .load(file)
-                                    .ignoreBy(400)
-                                    .setTargetDir(file.getParentFile().getAbsolutePath())
-                                    .get();
-                            File compressedFile = fileList.get(0);
+//                            List<File> fileList = Luban.with(context)
+//                                    .load(file)
+//                                    .ignoreBy(400)
+//                                    .setTargetDir(file.getParentFile().getAbsolutePath())
+//                                    .get();
+//                            File compressedFile = fileList.get(0);
+
+                            File compressedFile = file;
+                            if (file.length() > 400 * 1024) {
+                                compressedFile = new Compressor(context.getApplicationContext())
+                                        .setQuality(90)
+                                        .setDestinationDirectoryPath(file.getParentFile().getAbsolutePath())
+                                        .compressToFile(file, "cp_" + file.getName());
+                            }
 
-                            //从相册选择图片上传的话,不要删除原图
-                            //file.delete();
                             // 通知相册去获取
                             MediaScannerConnection.scanFile(context, new String[] { compressedFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
-                            // 保存最终截图成功
-                            // 根据URI获取图片的base64字符串
+                            // 保存最终截图成功,根据URI获取图片的base64字符串
                             photoBase64 = Base64Tool.getBase64FromFilePath(compressedFile.getAbsolutePath());
 
                             if (TextUtils.isEmpty(photoBase64)) {
                                 photoBase64 = Base64Tool.getBase64FromUri(context, uri);
                             }
 
+                            //从相册选择图片上传的话,不要删除原图
+                            if (file != compressedFile) {
+                                file.delete();
+                                compressedFile.delete();
+                            } else {
+                                file.delete();
+                            }
+
                             if (TextUtils.isEmpty(photoBase64)) {
                                 emitter.onError(new Exception("Empty image"));
                             } else {
@@ -406,7 +420,14 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                             .setTargetDir(file.getParentFile().getAbsolutePath()).get();
                     if (fileList != null && fileList.size() == 1) {
                         File compressedFile = fileList.get(0);
-                        // 通知相册去获取
+
+//                    File compressedFile = new Compressor(context.getApplicationContext())
+//                            .setQuality(99)
+//                            .setDestinationDirectoryPath(file.getParentFile().getAbsolutePath())
+//                            .compressToFile(file, "cp_" + file.getName());
+//
+//                    if (compressedFile.exists()) {
+                    // 通知相册去获取
                         MediaScannerConnection.scanFile(context, new String[] { compressedFile.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
                         //MediaScannerConnection.scanFile(context, new String[] { file.getAbsolutePath() }, new String[] { "image/jpeg" }, null);
                         // 保存最终截图成功,根据URI获取图片的base64字符串

+ 5 - 0
app/src/main/java/com/miekir/ocr/ui/camera/otalia/OtaCameraActivity.java

@@ -24,6 +24,7 @@ import com.otaliastudios.cameraview.filters.ContrastFilter;
 import com.otaliastudios.cameraview.filters.SharpnessFilter;
 import com.otaliastudios.cameraview.frame.Frame;
 import com.otaliastudios.cameraview.frame.FrameProcessor;
+import com.otaliastudios.cameraview.size.SizeSelectors;
 
 /**
  * Copyright (C), 2019-2020, Miekir
@@ -86,6 +87,10 @@ public class OtaCameraActivity extends BaseCameraActivity {
         camera.addCameraListener(new Listener());
         camera.setPlaySounds(false);
         camera.setSoundEffectsEnabled(false);
+        camera.setPictureSize(SizeSelectors.biggest());
+        camera.close();
+        camera.open();
+        //cameraView.setPictureSize { arrayListOf(Size(768, 1024)) }
         //camera.setFilter(Filters.SHARPNESS.newInstance());
         SharpnessFilter sharpnessFilter = (SharpnessFilter)Filters.SHARPNESS.newInstance();
         //0~1.0

+ 16 - 0
camera/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java

@@ -42,6 +42,22 @@ import static android.graphics.Bitmap.createBitmap;
 import static android.hardware.Camera.Parameters.ANTIBANDING_AUTO;
 
 /**
+ * 从sizeArray中找到满足16:9比例,且不超过1920x1080的最大Size.
+ *
+ * 若找不到,则选择满足16:9比例的最大Size(像素数可能超过1920x1080).
+ *
+ * 若仍找不到,返回最大Size.
+ *
+ * 预览尺寸不要超过1920x1080,否则相机带宽吃紧,这也是Camera2 API的要求.
+ *
+ * 确定使用的照片尺寸 :
+ * 从sizeArray中找到满足16:9比例,且不超过maxPicturePixels指定的像素数的最大Size.
+ *
+ * 若找不到,则选择满足16:9比例的最大Size(像素数可能超过maxPicturePixels).
+ *
+ * 若仍找不到,返回最大Size.
+ *
+ * maxPicturePixels通过Intent的Extra传入.
  * =====================================
  * 作    者: 陈嘉桐
  * 版    本:1.1.4