新增 AspectRatioCameraConfig 和 ResolutionCameraConfig

This commit is contained in:
Jenly
2021-08-03 18:49:04 +08:00
parent 685cf35d46
commit 85a3cba5ce
7 changed files with 141 additions and 24 deletions

View File

@@ -21,7 +21,7 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.zxing.Result; import com.google.zxing.Result;
import com.king.zxing.CameraConfig; import com.king.zxing.config.CameraConfig;
import com.king.zxing.CaptureActivity; import com.king.zxing.CaptureActivity;
import com.king.zxing.DecodeConfig; import com.king.zxing.DecodeConfig;
import com.king.zxing.DecodeFormatManager; import com.king.zxing.DecodeFormatManager;

View File

@@ -10,6 +10,7 @@ import com.king.zxing.analyze.AreaRectAnalyzer;
import com.king.zxing.analyze.BarcodeFormatAnalyzer; import com.king.zxing.analyze.BarcodeFormatAnalyzer;
import com.king.zxing.analyze.ImageAnalyzer; import com.king.zxing.analyze.ImageAnalyzer;
import com.king.zxing.analyze.MultiFormatAnalyzer; import com.king.zxing.analyze.MultiFormatAnalyzer;
import com.king.zxing.config.CameraConfig;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.camera.core.CameraSelector; import androidx.camera.core.CameraSelector;

View File

@@ -6,6 +6,7 @@ import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType; import com.google.zxing.DecodeHintType;
import com.google.zxing.common.GlobalHistogramBinarizer; import com.google.zxing.common.GlobalHistogramBinarizer;
import com.google.zxing.common.HybridBinarizer; import com.google.zxing.common.HybridBinarizer;
import com.king.zxing.config.CameraConfig;
import java.util.Map; import java.util.Map;

View File

@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Size;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.ScaleGestureDetector; import android.view.ScaleGestureDetector;
import android.view.View; import android.view.View;
@@ -16,6 +15,7 @@ import com.google.zxing.ResultPoint;
import com.google.zxing.common.detector.MathUtils; import com.google.zxing.common.detector.MathUtils;
import com.king.zxing.analyze.Analyzer; import com.king.zxing.analyze.Analyzer;
import com.king.zxing.analyze.MultiFormatAnalyzer; import com.king.zxing.analyze.MultiFormatAnalyzer;
import com.king.zxing.config.CameraConfig;
import com.king.zxing.manager.AmbientLightManager; import com.king.zxing.manager.AmbientLightManager;
import com.king.zxing.manager.BeepManager; import com.king.zxing.manager.BeepManager;
import com.king.zxing.util.LogUtils; import com.king.zxing.util.LogUtils;
@@ -98,7 +98,6 @@ public class DefaultCameraScan extends CameraScan {
private boolean isClickTap; private boolean isClickTap;
private float mDownX; private float mDownX;
private float mDownY; private float mDownY;
private Size mTargetSize;
public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){ public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){
this.mFragmentActivity = activity; this.mFragmentActivity = activity;
@@ -155,23 +154,6 @@ public class DefaultCameraScan extends CameraScan {
mScreenHeight = displayMetrics.heightPixels; mScreenHeight = displayMetrics.heightPixels;
LogUtils.d(String.format("displayMetrics:%dx%d",mScreenWidth,mScreenHeight)); LogUtils.d(String.format("displayMetrics:%dx%d",mScreenWidth,mScreenHeight));
//因为为了保持流畅性和性能限制在1080p在此前提下尽可能的找到屏幕接近的分辨率
if(mScreenWidth < mScreenHeight){
float ratio = mScreenWidth / (float)mScreenHeight;
if(ratio > 0.7){//一般应用于平板
mTargetSize = new Size(mScreenWidth,mScreenWidth / 3 * 4);
}else{
mTargetSize = new Size(mScreenWidth,mScreenWidth / 9 * 16);
}
}else{
float ratio = mScreenHeight / (float)mScreenWidth;
if(ratio > 0.7){//一般应用于平板
mTargetSize = new Size(mScreenHeight / 3 * 4, mScreenHeight);
}else{
mTargetSize = new Size(mScreenHeight / 9 * 16, mScreenHeight);
}
}
LogUtils.d("targetSize:" + mTargetSize);
mBeepManager = new BeepManager(mContext); mBeepManager = new BeepManager(mContext);
mAmbientLightManager = new AmbientLightManager(mContext); mAmbientLightManager = new AmbientLightManager(mContext);
@@ -250,8 +232,7 @@ public class DefaultCameraScan extends CameraScan {
mCameraProviderFuture.addListener(() -> { mCameraProviderFuture.addListener(() -> {
try{ try{
Preview preview = mCameraConfig.options(new Preview.Builder() Preview preview = mCameraConfig.options(new Preview.Builder());
.setTargetResolution(mTargetSize));
//相机选择器 //相机选择器
CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder()); CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder());
@@ -260,7 +241,6 @@ public class DefaultCameraScan extends CameraScan {
//图像分析 //图像分析
ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder() ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder()
.setTargetResolution(mTargetSize)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)); .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST));
imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> { imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {
if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){ if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){

View File

@@ -0,0 +1,62 @@
package com.king.zxing.config;
import android.content.Context;
import android.util.DisplayMetrics;
import com.king.zxing.util.LogUtils;
import androidx.annotation.NonNull;
import androidx.camera.core.AspectRatio;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.Preview;
/**
* 相机配置:根据纵横比配置相机,使预览和输出的图像尽可能的接近屏幕比例
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public final class AspectRatioCameraConfig extends CameraConfig {
private int mAspectRatio;
public AspectRatioCameraConfig(Context context) {
super();
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
mAspectRatio = aspectRatio(width, height);
LogUtils.d("aspectRatio:" + mAspectRatio);
}
private int aspectRatio(float width, float height){
float ratio = Math.max(width, height) / Math.min(width, height);
if (Math.abs(ratio - 4.0f / 3.0f) < Math.abs(ratio - 16.0f / 9.0f)) {
return AspectRatio.RATIO_4_3;
}
return AspectRatio.RATIO_16_9;
}
@NonNull
@Override
public Preview options(@NonNull Preview.Builder builder) {
builder.setTargetAspectRatio(mAspectRatio);
return super.options(builder);
}
@NonNull
@Override
public CameraSelector options(@NonNull CameraSelector.Builder builder) {
return super.options(builder);
}
@NonNull
@Override
public ImageAnalysis options(@NonNull ImageAnalysis.Builder builder) {
builder.setTargetAspectRatio(mAspectRatio);
return super.options(builder);
}
}

View File

@@ -1,4 +1,4 @@
package com.king.zxing; package com.king.zxing.config;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.camera.core.CameraSelector; import androidx.camera.core.CameraSelector;

View File

@@ -0,0 +1,73 @@
package com.king.zxing.config;
import android.content.Context;
import android.util.DisplayMetrics;
import android.util.Size;
import com.king.zxing.util.LogUtils;
import androidx.annotation.NonNull;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.Preview;
/**
* 相机配置:根据尺寸配置相机的目标图像,使预览和输出的图像尽可能的接近屏幕尺寸
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class ResolutionCameraConfig extends CameraConfig {
private Size mTargetSize;
public ResolutionCameraConfig(Context context) {
super();
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
LogUtils.d(String.format("displayMetrics:%d x %d",width,height));
//因为为了保持流畅性和性能限制在1080p在此前提下尽可能的找到屏幕接近的分辨率
if(width < height){
int size = Math.min(width, 1080);
float ratio = width / (float)height;
if(ratio > 0.7){//一般应用于平板
mTargetSize = new Size(size, (int)(size / 3.0f * 4.0f));
}else{
mTargetSize = new Size(size, (int)(size / 9.0f * 16.0f));
}
}else{
int size = Math.min(height, 1080);
float ratio = height / (float)width;
if(ratio > 0.7){//一般应用于平板
mTargetSize = new Size((int)(size / 3.0f * 4.0f), size);
}else{
mTargetSize = new Size((int)(size / 9.0f * 16.0), size);
}
}
LogUtils.d("targetSize:" + mTargetSize);
}
@NonNull
@Override
public Preview options(@NonNull Preview.Builder builder) {
builder.setTargetResolution(mTargetSize);
return super.options(builder);
}
@NonNull
@Override
public CameraSelector options(@NonNull CameraSelector.Builder builder) {
return super.options(builder);
}
@NonNull
@Override
public ImageAnalysis options(@NonNull ImageAnalysis.Builder builder) {
builder.setTargetResolution(mTargetSize);
return super.options(builder);
}
}