Selaa lähdekoodia

对话框优化

詹子聪 5 vuotta sitten
vanhempi
commit
1a3131bd79

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

@@ -1,11 +1,17 @@
 package com.miekir.ocr.tool;
 
+import android.graphics.Bitmap;
 import android.graphics.ImageFormat;
+import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.YuvImage;
 import android.media.Image;
 
+import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public final class ImageUtil {
@@ -55,7 +61,27 @@ public final class ImageUtil {
     }
 
 
+    public static boolean saveBitmapFile(Bitmap bitmap, File file){
+        try {
+            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
+            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
+            bos.flush();
+            bos.close();
+            return true;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 
-
-
+    /**
+     * 顺时针旋转90度
+     * @return
+     */
+    public static Bitmap rotateBitmap90(Bitmap rawBitmap) {
+        Matrix matrix = new Matrix();
+        matrix.postRotate(90);
+        Bitmap scaledBitmap = Bitmap.createScaledBitmap(rawBitmap, rawBitmap.getWidth(), rawBitmap.getHeight(), true);
+        return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true);
+    }
 }

+ 33 - 8
app/src/main/java/com/miekir/ocr/ui/CameraActivity.java

@@ -5,6 +5,8 @@ import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
 import android.graphics.Point;
 import android.graphics.SurfaceTexture;
@@ -30,14 +32,12 @@ import android.util.Size;
 import android.util.SparseIntArray;
 import android.view.Surface;
 import android.view.TextureView;
-import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 
 import com.miekir.ocr.R;
 import com.miekir.ocr.base.BaseCameraActivity;
 import com.miekir.ocr.tool.CameraPreviewTool;
-import com.miekir.ocr.tool.FileManager;
 import com.miekir.ocr.tool.ImageUtil;
 import com.miekir.ocr.widget.AutoFitTextureView;
 
@@ -55,6 +55,11 @@ import java.util.concurrent.TimeUnit;
 import static android.os.Environment.DIRECTORY_PICTURES;
 
 public class CameraActivity extends BaseCameraActivity {
+    protected int mLeft;
+    protected int mTop;
+    protected int mRight;
+    protected int mBottom;
+
     private CameraManager mCameraManager;
 
     private static SparseIntArray ORIENTATIONS = new SparseIntArray();
@@ -290,7 +295,7 @@ public class CameraActivity extends BaseCameraActivity {
 
                 @Override
                 public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
-                    Toast.makeText(CameraActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
+                    //Toast.makeText(CameraActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
                 }
             }, null);
         } catch (CameraAccessException e) {
@@ -407,10 +412,8 @@ public class CameraActivity extends BaseCameraActivity {
                 @Override
                 public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                     super.onCaptureCompleted(session, request, result);
-                    Toast.makeText(CameraActivity.this, "Saved:" + file, Toast.LENGTH_SHORT).show();
+                    //Toast.makeText(CameraActivity.this, "Saved:" + file, Toast.LENGTH_SHORT).show();
                     createCameraPreview();
-
-
                 }
 
             };
@@ -443,8 +446,24 @@ public class CameraActivity extends BaseCameraActivity {
             if (image != null) {
                 //converting to JPEG
                 byte[] jpegData = ImageUtil.imageToByteArray(image);
-                //write to file (for example ..some_path/frame.jpg)
-                FileManager.writeFrame(file.getAbsolutePath(), jpegData);
+
+                // 得到裁剪后的图片
+                Bitmap originalBmp = BitmapFactory.decodeByteArray(jpegData , 0, jpegData.length);
+                // 这里由于要快速拍照,使用的格式是ImageFormat.YUV_420_888,导致拍出来的照片自动逆时针90度,所以要转换裁剪位置
+
+                Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, mTop, originalBmp.getHeight()-mRight, mBottom-mTop, mRight-mLeft);
+                // 旋转90度,让OCR可以识别
+                Bitmap rotatedBitmap = ImageUtil.rotateBitmap90(croppedBmp);
+                boolean saveCropSuccess = ImageUtil.saveBitmapFile(rotatedBitmap, file);
+                if (saveCropSuccess) {
+                    // 上传识别
+                    onCropFinish(file.getAbsolutePath());
+                }
+                originalBmp.recycle();
+                croppedBmp.recycle();
+                rotatedBitmap.recycle();
+                // 写入到文件
+                //FileManager.writeFrame(file.getAbsolutePath(), jpegData);
                 image.close();
             }
 
@@ -480,4 +499,10 @@ public class CameraActivity extends BaseCameraActivity {
     };
 
 
+    /**
+     * 裁剪完成,上传识别
+     */
+    protected void onCropFinish(String path) {
+
+    }
 }

+ 27 - 0
app/src/main/java/com/miekir/ocr/ui/OperationActivity.java

@@ -89,6 +89,16 @@ public class OperationActivity extends CameraActivity implements CropView.onLoca
         }
     }
 
+    @Override
+    protected void onCropFinish(String path) {
+        super.onCropFinish(path);
+        mOperationPresenter.startOcrFromFile(this, path, mCurrentScene);
+    }
+
+    /**
+     * 设置裁剪区域
+     * @param viewId
+     */
     private void setScanArea(int viewId) {
         for (int index = 0, len = MENU_ID_LIST.length; index < len; index++) {
             IndicatorText indicatorText = findViewById(MENU_ID_LIST[index]);
@@ -118,6 +128,16 @@ public class OperationActivity extends CameraActivity implements CropView.onLoca
     @Override
     public void locationRect(int startX, int startY, int endX, int endY) {
         // 截取的区域坐标信息
+        //System.out.println("x:"+startX + "   y:" + startY + "    endX:" + endX + "   endY" + endY);
+        mLeft = startX;
+        mTop = startY;
+        mRight = endX;
+        mBottom = endY;
+
+        /*mLeft = startY;
+        mTop = SizeTool.SCREEN_WIDTH - endX;
+        mRight = endY;
+        mBottom = SizeTool.SCREEN_WIDTH - startX;*/
     }
 
     @Override
@@ -192,10 +212,17 @@ public class OperationActivity extends CameraActivity implements CropView.onLoca
             tv_name.setVisibility(View.VISIBLE);
         } else if (mCurrentType == CropView.SCAN_TYPE_POSTAL) {
             tv_postal.setVisibility(View.VISIBLE);
+            tv_address.setVisibility(View.GONE);
+            tv_name.setVisibility(View.GONE);
         } else if (mCurrentType == CropView.SCAN_TYPE_ADDRESS) {
             tv_address.setVisibility(View.VISIBLE);
+            tv_postal.setVisibility(View.GONE);
+            tv_name.setVisibility(View.GONE);
+
         } else if (mCurrentType == CropView.SCAN_TYPE_NAME) {
             tv_name.setVisibility(View.VISIBLE);
+            tv_postal.setVisibility(View.GONE);
+            tv_address.setVisibility(View.GONE);
         }
 
         if (result.postcode != null) {

+ 58 - 0
app/src/main/java/com/miekir/ocr/ui/OperationPresenter.java

@@ -87,4 +87,62 @@ public class OperationPresenter extends BasePresenter<IOperationView> {
                 }
             });
     }
+
+    /**
+     *
+     * @param context
+     * @param filePath 图片路径
+     * @param scene 识别场景类型
+     */
+    public void startOcrFromFile(Context context, String filePath, String scene) {
+        getView().showLoading(context.getResources().getString(R.string.loading));
+        Observable.create(new ObservableOnSubscribe<String>() {
+            @Override
+            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
+                // 根据URI获取图片的base64字符串
+                String photoBase64 = Base64Tool.getBase64FromFilePath(filePath);
+                if (TextUtils.isEmpty(photoBase64)) {
+                    emitter.onError(new Exception("Empty image"));
+                } else {
+                    emitter.onNext(photoBase64);
+                }
+            }})
+                /*.filter(base64String -> {
+                    // 图片base64不为空才继续,否则直接忽略,没有任何回调会被调用
+                    return !TextUtils.isEmpty(base64String);
+                })*/
+                .flatMap(photoBase64 -> {
+                    Map<String, Object> requestParams = new HashMap<>();
+                    requestParams.put("request_id", "035992000119071904311742_"+ DateTool.getRequestId());
+                    requestParams.put("appid", "10233937");
+                    requestParams.put("image", photoBase64);
+                    Map<String, Object> options = new HashMap<>();
+                    options.put("scene", scene);
+                    requestParams.put("options", options);
+
+                    // 发送识别请求
+                    return RetrofitHelper.getInstance()
+                            .getRequestApi(ApiService.class)
+                            .getOcrResult(requestParams);
+                })
+                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new BaseObserver<OcrResult>() {
+                    @Override
+                    public void onSuccess(OcrResult result) {
+                        if (getView() != null) {
+                            getView().dismissLoading();
+                            getView().onOcrResult(result);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable e, String errMsg) {
+                        // 装饰器模式
+                        if (getView() != null) {
+                            getView().dismissLoading();
+                            getView().onOcrResult(null);
+                        }
+                    }
+                });
+    }
 }