Zxing怎样扩大扫描区域?
答案:1 悬赏:80 手机版
解决时间 2021-11-26 01:36
- 提问者网友:最爱你的唇
- 2021-11-25 19:03
Zxing怎样扩大扫描区域?
最佳答案
- 五星知识达人网友:平生事
- 2021-11-25 20:30
CameraManager.java
public Rect getFramingRect()//扫描采集区。也就是你的扫描区
public Rect getFramingRectInPreview()//预览区域。也就是扫面是画的那个框
上面2个方法理论返回应该是一样的,这样2个区域才能重合。不过你想要一些别的效果也可以不一样。如:扫描区返回整个屏幕。预览区只返回中间一块。那么扫描显示框只有一块。但是扫描的时候只要已进入屏幕就能扫除结果。追问现在就是我更改了getFramingRect使扫描框变大了,但是实际扫描还是需要把二维码放在中心一个很小的区域才可以。追答你将上面2个方法都放大了么?getFramingRectInPreview()才是扫描数据采集区。。。刚才的说反了
public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data,
int width, int height) {
Rect rect = getFramingRectInPreview();//这里定义yuv数据(及分析的图形信息)的时候用的
int previewFormat = configManager.getPreviewFormat();追问getFramingRectInPreviee修改大后会报错,而且这两个矩形也没有对齐追答你看看你修改getFramingRectInPreviee报的什么错,把那个解决了就行了
个人觉得:你在改大的时候是随意写的大小,不是根据configManager.getCameraResolution()的大小来的。所以可能把采集区超出了相机范围,所以报错了追问他的错误是crop rectangle does not fit within image data 是一个自定义的错误,因为我改成这两个函数返回相同的值了,但不知道这错误什么意思。追答这两个方法,一个是根据手机像素得到扫描框(getFramingRect())如800*480
一个是根据当前手机摄像头采用的像素配置得到数据采集区(getFramingRectInPreview())如480*320
这两个大小是不一样的。只是最终区域一样的,也就是把相机图形显示到屏幕的时候有一定缩放。所以你的2个返回的矩形很可能是不一样的。
所以最后:这两个方法返回区域最后都根据比例获取,这样结果的rect不一样,但是实际是重合的。
如下:我采用的是屏幕宽度的3/5
public Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Point cameraResolution = configManager.getCameraResolution();//相机参数在getFramingRect()中换成configManager.getScreenResolution()获取屏幕参数
int width;
int height;
int min = Math.min(cameraResolution.x, cameraResolution.y);
width = height = min * 3 / 5;
int leftOffset = (cameraResolution.x - width) / 2;
int topOffset = (cameraResolution.y - height) / 2;
framingRectInPreview = new Rect(leftOffset, topOffset, leftOffset
+ width, topOffset + height);
}
return framingRectInPreview;
}
如果你要全屏识别,最简单就是:
framingRectInPreview = new Rect(0, 0, cameraResolution.x,cameraResolution.y);追问我改成了framingRectInPreview = new Rect(0, 0, cameraResolution.x,cameraResolution.y);但是会报错:java.lang.IllegalArgumentException: Crop rectangle does not fit within image data.然后就退出了。。刚刚重新下了个zxing弄了弄发现两个矩形对齐了,framingRectinpreview也变大了,但是扫描的时候还是必须把手机离很远,把条形码放在中心一小块区域(基本还是原先的大小)才能识别出来。兄弟,就靠你了!追答我的。屏幕的3/5大小
public Rect getFramingRect() {
Point screenResolution = configManager.getScreenResolution();
if (framingRect == null) {
if (camera == null) {
return null;
}
int width;
int height;
int min = Math.min(screenResolution.x, screenResolution.y);
width = height = min * 3 / 5;
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width,
topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}
public Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Point cameraResolution = configManager.getCameraResolution();
int width;
int height;
int min = Math.min(cameraResolution.x, cameraResolution.y);
width = height = min * 3 / 5;
int leftOffset = (cameraResolution.x - width) / 2;
int topOffset = (cameraResolution.y - height) / 2;
framingRectInPreview = new Rect(leftOffset, topOffset, leftOffset
+ width, topOffset + height);
}
return framingRectInPreview;
}追问你的这个可以识别比较大的二维码吗?追答进了扫描区,都能扫。你也可以把*3/5,该成*5/5,也就去掉,那扫描框就是屏幕宽度的正方型追问好我试试,谢谢!追答在DecodeHandler.java中:decode(byte[] data, int width, int height);解析数据;该方法在
public void handleMessage(Message message) {
。。
decode((byte[]) message.obj, message.arg1, message.arg2);
。。
}
}消息回调时,调用。在PreviewCallback.java中:
public void onPreviewFrame(byte[] data, Camera camera) {
。。
Message message = previewHandler.obtainMessage(previewMessage, cameraResolution.x,
cameraResolution.y, data);//注意是cameraResolution.x;cameraResolution.y
message.sendToTarget();
。。。
}使用消息回调,传了参数相机的x和y。
在decode方法中:PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);//这里的width=x,height=y
在buildLuminanceSource方法,里面用到了Rect rect = getFramingRectInPreview();//扫描区。
生成yuvsource进入了PlanarYUVLuminanceSource构造方法。里面对比了你的rect和x与y:
if (left + width > dataWidth || top + height > dataHeight) {//dataWidth =x,dataHeight=y
throw new IllegalArgumentException(
"Crop rectangle does not fit within image data.");所以:如果你随意写getFramingRectInPreview()方法,超出范围,这个异常就来了
}
public Rect getFramingRect()//扫描采集区。也就是你的扫描区
public Rect getFramingRectInPreview()//预览区域。也就是扫面是画的那个框
上面2个方法理论返回应该是一样的,这样2个区域才能重合。不过你想要一些别的效果也可以不一样。如:扫描区返回整个屏幕。预览区只返回中间一块。那么扫描显示框只有一块。但是扫描的时候只要已进入屏幕就能扫除结果。追问现在就是我更改了getFramingRect使扫描框变大了,但是实际扫描还是需要把二维码放在中心一个很小的区域才可以。追答你将上面2个方法都放大了么?getFramingRectInPreview()才是扫描数据采集区。。。刚才的说反了
public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data,
int width, int height) {
Rect rect = getFramingRectInPreview();//这里定义yuv数据(及分析的图形信息)的时候用的
int previewFormat = configManager.getPreviewFormat();追问getFramingRectInPreviee修改大后会报错,而且这两个矩形也没有对齐追答你看看你修改getFramingRectInPreviee报的什么错,把那个解决了就行了
个人觉得:你在改大的时候是随意写的大小,不是根据configManager.getCameraResolution()的大小来的。所以可能把采集区超出了相机范围,所以报错了追问他的错误是crop rectangle does not fit within image data 是一个自定义的错误,因为我改成这两个函数返回相同的值了,但不知道这错误什么意思。追答这两个方法,一个是根据手机像素得到扫描框(getFramingRect())如800*480
一个是根据当前手机摄像头采用的像素配置得到数据采集区(getFramingRectInPreview())如480*320
这两个大小是不一样的。只是最终区域一样的,也就是把相机图形显示到屏幕的时候有一定缩放。所以你的2个返回的矩形很可能是不一样的。
所以最后:这两个方法返回区域最后都根据比例获取,这样结果的rect不一样,但是实际是重合的。
如下:我采用的是屏幕宽度的3/5
public Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Point cameraResolution = configManager.getCameraResolution();//相机参数在getFramingRect()中换成configManager.getScreenResolution()获取屏幕参数
int width;
int height;
int min = Math.min(cameraResolution.x, cameraResolution.y);
width = height = min * 3 / 5;
int leftOffset = (cameraResolution.x - width) / 2;
int topOffset = (cameraResolution.y - height) / 2;
framingRectInPreview = new Rect(leftOffset, topOffset, leftOffset
+ width, topOffset + height);
}
return framingRectInPreview;
}
如果你要全屏识别,最简单就是:
framingRectInPreview = new Rect(0, 0, cameraResolution.x,cameraResolution.y);追问我改成了framingRectInPreview = new Rect(0, 0, cameraResolution.x,cameraResolution.y);但是会报错:java.lang.IllegalArgumentException: Crop rectangle does not fit within image data.然后就退出了。。刚刚重新下了个zxing弄了弄发现两个矩形对齐了,framingRectinpreview也变大了,但是扫描的时候还是必须把手机离很远,把条形码放在中心一小块区域(基本还是原先的大小)才能识别出来。兄弟,就靠你了!追答我的。屏幕的3/5大小
public Rect getFramingRect() {
Point screenResolution = configManager.getScreenResolution();
if (framingRect == null) {
if (camera == null) {
return null;
}
int width;
int height;
int min = Math.min(screenResolution.x, screenResolution.y);
width = height = min * 3 / 5;
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
framingRect = new Rect(leftOffset, topOffset, leftOffset + width,
topOffset + height);
Log.d(TAG, "Calculated framing rect: " + framingRect);
}
return framingRect;
}
public Rect getFramingRectInPreview() {
if (framingRectInPreview == null) {
Point cameraResolution = configManager.getCameraResolution();
int width;
int height;
int min = Math.min(cameraResolution.x, cameraResolution.y);
width = height = min * 3 / 5;
int leftOffset = (cameraResolution.x - width) / 2;
int topOffset = (cameraResolution.y - height) / 2;
framingRectInPreview = new Rect(leftOffset, topOffset, leftOffset
+ width, topOffset + height);
}
return framingRectInPreview;
}追问你的这个可以识别比较大的二维码吗?追答进了扫描区,都能扫。你也可以把*3/5,该成*5/5,也就去掉,那扫描框就是屏幕宽度的正方型追问好我试试,谢谢!追答在DecodeHandler.java中:decode(byte[] data, int width, int height);解析数据;该方法在
public void handleMessage(Message message) {
。。
decode((byte[]) message.obj, message.arg1, message.arg2);
。。
}
}消息回调时,调用。在PreviewCallback.java中:
public void onPreviewFrame(byte[] data, Camera camera) {
。。
Message message = previewHandler.obtainMessage(previewMessage, cameraResolution.x,
cameraResolution.y, data);//注意是cameraResolution.x;cameraResolution.y
message.sendToTarget();
。。。
}使用消息回调,传了参数相机的x和y。
在decode方法中:PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);//这里的width=x,height=y
在buildLuminanceSource方法,里面用到了Rect rect = getFramingRectInPreview();//扫描区。
生成yuvsource进入了PlanarYUVLuminanceSource构造方法。里面对比了你的rect和x与y:
if (left + width > dataWidth || top + height > dataHeight) {//dataWidth =x,dataHeight=y
throw new IllegalArgumentException(
"Crop rectangle does not fit within image data.");所以:如果你随意写getFramingRectInPreview()方法,超出范围,这个异常就来了
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯