新增 AspectRatioCameraConfig 和 ResolutionCameraConfig
This commit is contained in:
@@ -21,7 +21,7 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
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.DecodeConfig;
|
||||
import com.king.zxing.DecodeFormatManager;
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.king.zxing.analyze.AreaRectAnalyzer;
|
||||
import com.king.zxing.analyze.BarcodeFormatAnalyzer;
|
||||
import com.king.zxing.analyze.ImageAnalyzer;
|
||||
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
||||
import com.king.zxing.config.CameraConfig;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.camera.core.CameraSelector;
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.DecodeHintType;
|
||||
import com.google.zxing.common.GlobalHistogramBinarizer;
|
||||
import com.google.zxing.common.HybridBinarizer;
|
||||
import com.king.zxing.config.CameraConfig;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Size;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import android.view.View;
|
||||
@@ -16,6 +15,7 @@ import com.google.zxing.ResultPoint;
|
||||
import com.google.zxing.common.detector.MathUtils;
|
||||
import com.king.zxing.analyze.Analyzer;
|
||||
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
||||
import com.king.zxing.config.CameraConfig;
|
||||
import com.king.zxing.manager.AmbientLightManager;
|
||||
import com.king.zxing.manager.BeepManager;
|
||||
import com.king.zxing.util.LogUtils;
|
||||
@@ -98,7 +98,6 @@ public class DefaultCameraScan extends CameraScan {
|
||||
private boolean isClickTap;
|
||||
private float mDownX;
|
||||
private float mDownY;
|
||||
private Size mTargetSize;
|
||||
|
||||
public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){
|
||||
this.mFragmentActivity = activity;
|
||||
@@ -155,23 +154,6 @@ public class DefaultCameraScan extends CameraScan {
|
||||
mScreenHeight = displayMetrics.heightPixels;
|
||||
|
||||
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);
|
||||
mAmbientLightManager = new AmbientLightManager(mContext);
|
||||
@@ -250,8 +232,7 @@ public class DefaultCameraScan extends CameraScan {
|
||||
mCameraProviderFuture.addListener(() -> {
|
||||
|
||||
try{
|
||||
Preview preview = mCameraConfig.options(new Preview.Builder()
|
||||
.setTargetResolution(mTargetSize));
|
||||
Preview preview = mCameraConfig.options(new Preview.Builder());
|
||||
|
||||
//相机选择器
|
||||
CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder());
|
||||
@@ -260,7 +241,6 @@ public class DefaultCameraScan extends CameraScan {
|
||||
|
||||
//图像分析
|
||||
ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder()
|
||||
.setTargetResolution(mTargetSize)
|
||||
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST));
|
||||
imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {
|
||||
if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.king.zxing;
|
||||
package com.king.zxing.config;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.camera.core.CameraSelector;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user