瀏覽代碼

选择的图片也压缩和纠正

詹子聪 5 年之前
父節點
當前提交
8cf9cc9711

+ 2 - 1
app/src/main/java/com/miekir/ocr/tool/Base64Tool.java

@@ -43,7 +43,8 @@ public class Base64Tool {
         }
 
         final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
-        encodedString = bitmap2Base64(selectedImage);
+        // 需要旋转90度才正常
+        encodedString = bitmap2Base64(ImageUtil.rotateBitmap90(selectedImage));
 
         return encodedString;
     }

+ 109 - 0
app/src/main/java/com/miekir/ocr/tool/FileUtil.java

@@ -0,0 +1,109 @@
+package com.miekir.ocr.tool;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.OpenableColumns;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class FileUtil {
+    private static final int EOF = -1;
+    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
+
+    private FileUtil() {
+
+    }
+
+    public static File from(Context context, Uri uri) throws IOException {
+        InputStream inputStream = context.getContentResolver().openInputStream(uri);
+        String fileName = getFileName(context, uri);
+        String[] splitName = splitFileName(fileName);
+        File tempFile = File.createTempFile(splitName[0], splitName[1]);
+        tempFile = rename(tempFile, fileName);
+        tempFile.deleteOnExit();
+        FileOutputStream out = null;
+        try {
+            out = new FileOutputStream(tempFile);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        if (inputStream != null) {
+            copy(inputStream, out);
+            inputStream.close();
+        }
+
+        if (out != null) {
+            out.close();
+        }
+        return tempFile;
+    }
+
+    private static String[] splitFileName(String fileName) {
+        String name = fileName;
+        String extension = "";
+        int i = fileName.lastIndexOf(".");
+        if (i != -1) {
+            name = fileName.substring(0, i);
+            extension = fileName.substring(i);
+        }
+
+        return new String[]{name, extension};
+    }
+
+    private static String getFileName(Context context, Uri uri) {
+        String result = null;
+        if (uri.getScheme().equals("content")) {
+            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
+            try {
+                if (cursor != null && cursor.moveToFirst()) {
+                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                if (cursor != null) {
+                    cursor.close();
+                }
+            }
+        }
+        if (result == null) {
+            result = uri.getPath();
+            int cut = result.lastIndexOf(File.separator);
+            if (cut != -1) {
+                result = result.substring(cut + 1);
+            }
+        }
+        return result;
+    }
+
+    private static File rename(File file, String newName) {
+        File newFile = new File(file.getParent(), newName);
+        if (!newFile.equals(file)) {
+            if (newFile.exists() && newFile.delete()) {
+                Log.d("FileUtil", "Delete old " + newName + " file");
+            }
+            if (file.renameTo(newFile)) {
+                Log.d("FileUtil", "Rename file to " + newName);
+            }
+        }
+        return newFile;
+    }
+
+    private static long copy(InputStream input, OutputStream output) throws IOException {
+        long count = 0;
+        int n;
+        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+        while (EOF != (n = input.read(buffer))) {
+            output.write(buffer, 0, n);
+            count += n;
+        }
+        return count;
+    }
+}

+ 28 - 0
app/src/main/java/com/miekir/ocr/tool/ImageUtil.java

@@ -1,17 +1,22 @@
 package com.miekir.ocr.tool;
 
+import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.YuvImage;
 import android.media.Image;
+import android.net.Uri;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.ByteBuffer;
 
 public final class ImageUtil {
@@ -136,4 +141,27 @@ public final class ImageUtil {
         Bitmap scaledBitmap = Bitmap.createScaledBitmap(rawBitmap, rawBitmap.getWidth(), rawBitmap.getHeight(), true);
         return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true);
     }
+
+    /**
+     * 图片Uri转Bitmap
+     *
+     * @param context
+     * @param imageUri
+     * @return
+     */
+    public static Bitmap getBitmapFromUri(Context context, Uri imageUri) {
+        if (imageUri == null) {
+            return null;
+        }
+
+        InputStream imageStream = null;
+        try {
+            imageStream = context.getContentResolver().openInputStream(imageUri);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+            return null;
+        }
+
+        return BitmapFactory.decodeStream(imageStream);
+    }
 }

+ 63 - 7
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -4,6 +4,7 @@ import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
+import android.os.Environment;
 import android.text.TextUtils;
 
 import com.miekir.common.utils.SizeTool;
@@ -29,6 +30,8 @@ import io.reactivex.ObservableOnSubscribe;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.schedulers.Schedulers;
 
+import static android.os.Environment.DIRECTORY_PICTURES;
+
 /**
  * @author 詹子聪
  * @date 2020/7/27 15:53
@@ -47,11 +50,62 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
             @Override
             public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                 // 根据URI获取图片的base64字符串
-                String photoBase64 = Base64Tool.getBase64FromUri(context, uri);
-                if (TextUtils.isEmpty(photoBase64)) {
-                    emitter.onError(new Exception("Empty image"));
+                String photoBase64 = null;
+                // 这个需要顺时针旋转90度才正常
+                Bitmap rotatedBitmap = ImageUtil.rotateBitmap90(ImageUtil.getBitmapFromUri(context, uri));
+
+                if (rotatedBitmap == null) {
+                    photoBase64 = Base64Tool.getBase64FromUri(context, uri);
+                    if (TextUtils.isEmpty(photoBase64)) {
+                        emitter.onError(new Exception("Empty image"));
+                    } else {
+                        emitter.onNext(photoBase64);
+                    }
                 } else {
-                    emitter.onNext(photoBase64);
+                    int max = rotatedBitmap.getWidth() > rotatedBitmap.getHeight() ? rotatedBitmap.getWidth() : rotatedBitmap.getHeight();
+                    int multi = 1;
+                    if (max > 1000) {
+                        multi = max / 1000 + 1;
+                    }
+
+                    File file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES) + "/" + System.currentTimeMillis() + ".jpg");
+                    if (!file.getParentFile().exists()) {
+                        file.getParentFile().mkdirs();
+                    }
+
+                    // 开始压缩图片
+                    boolean saveCropSuccess = ImageUtil.saveBitmapFile(rotatedBitmap, file, multi);
+
+                    rotatedBitmap.recycle();
+                    if (saveCropSuccess) {
+                        File compressedFile = new Compressor(context.getApplicationContext())
+                                .setQuality(90)
+                                .setDestinationDirectoryPath(file.getParentFile().getAbsolutePath())
+                                .compressToFile(file, "cp_" + file.getName());
+
+                        file.delete();
+                        // 保存最终截图成功
+                        // 根据URI获取图片的base64字符串
+                        photoBase64 = Base64Tool.getBase64FromFilePath(compressedFile.getAbsolutePath());
+
+                        if (TextUtils.isEmpty(photoBase64)) {
+                            photoBase64 = Base64Tool.getBase64FromUri(context, uri);
+                        }
+
+                        if (TextUtils.isEmpty(photoBase64)) {
+                            emitter.onError(new Exception("Empty image"));
+                        } else {
+                            emitter.onNext(photoBase64);
+                        }
+                    } else {
+                        photoBase64 = Base64Tool.getBase64FromUri(context, uri);
+
+                        if (TextUtils.isEmpty(photoBase64)) {
+                            emitter.onError(new Exception("Empty image"));
+                        } else {
+                            emitter.onNext(photoBase64);
+                        }
+                    }
                 }
             }
         })
@@ -258,8 +312,8 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                     rotatedBitmap = croppedBmp;
                 }
 
-                if (file.getParentFile() == null || !file.getParentFile().exists()) {
-                    file.mkdirs();
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs();
                 }
                 int max = rotatedBitmap.getWidth() > rotatedBitmap.getHeight() ? rotatedBitmap.getWidth() : rotatedBitmap.getHeight();
                 int multi = 1;
@@ -289,8 +343,9 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                         emitter.onNext(photoBase64);
                     }
                 } else {
-                    emitter.onNext("Crop photo error");
+                    emitter.onError(new Exception("Empty image"));
                 }
+
             }
         })
                 /*.filter(base64String -> {
@@ -332,6 +387,7 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                 });
     }
 
+
     private int mWidth = SizeTool.SCREEN_WIDTH;
     private int mHeight = SizeTool.SCREEN_HEIGHT;