ZXing改横屏识别为竖屏识别-中间极光线,并解决图像拉伸问题
2012-12-04 10:05
465 查看
好久没上csdn了, 在这里特别想念大家, 最近公司一段时间忙吧,无暇东顾。扫噶,还是直接进入主题吧
大家都知道 直接从google down下来的 zxing二维码扫描 是 在扫描界面 中间的红线是 竖着的 ,那么怎么能让它 横着 显示呢, 只 因简单几步,轻松搞定
首先讲下关键的几个类
CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。
CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
DecodeThread 解码的线程。
com.google.zxing.client.android.camera 包,摄像头控制包。
ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了
一 点开 com.google.zxing.client.android包下在DecodeHandler.java中,修改decode方法 在decode 方法中 修改 代码
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height); 把这行注释 在下方修改为:这里还是为了初学者考虑这样写
/**
* 在此修改
*/
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
/**
* 修改结束
*/
二 点开包com.google.zxing.client.android.camera 下 CameraManager 中 getFramingRectInPreview() 方法中 修改
// rect.left = rect.left * cameraResolution.x / screenResolution.x;
// rect.right = rect.right * cameraResolution.x / screenResolution.x;
// rect.top = rect.top * cameraResolution.y / screenResolution.y;
// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; // 修改前这四行 注释
/**
* 修改后
*/
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
三 顺便在 还在这个包中的 CameraConfigurationManager 类中的setDesiredCameraParameters方法中添加一句
第一、 void setDesiredCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Log.d(TAG, "Setting preview size: " + cameraResolution);
parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
setFlash(parameters);
setZoom(parameters);
camera.setParameters(parameters);
//camera.setDisplayOrientation(90);// 框框中改横线是 修改的 , 这行代码就可以注释了, 就不用了, 如果用这行代码 则会出现 极光线变成横线的时候 图像有拉伸的功能了
// 使摄像头旋转90度
setDisplayOrientation(camera, 90);
}
添加 setDisplayOrientation(camera, 90);这个方法.
/*改变照相机成像的方向的方法*/
protected void setDisplayOrientation(Camera camera, int angle) {
Method downPolymorphic = null;
try {
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[]{angle});
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
第二、
在 这个类中 的这个方法 void initFromCameraParameters(Camera camera) { 里面 在
Log.d(TAG, "Screen resolution: " + screenResolution);
下面添加如下代码
//为竖屏添加
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}
// 下句第二参数要根据竖屏修改
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
/*cameraResolution = getCameraResolution(parameters, screenResolution);*/ 并注释zxing自带的 这行代码
四 ,在AndroidManifest.xml中,把CaptureActivity的属性android:screenOrientation="landscape"
改为
android:screenOrientation="portrait"
够详细了吧, 开发 二维码扫描的哥们 在搞不出来, 实在不知道说什么好了 。
但是在修改中存在一个问题, 若是 在上述第三个步骤中 加入 camera.setDisplayOrientation(90); 这句话报错时, 给zxing换一个核心包,若是还报错直接换个搞点版本的Android包就OK 了, 建议直接换成 高点的Android 包。
当然加入这句话不错的哥们 就不用管啦, 唉, 为了后人不走弯路,特别奉上。
大家都知道 直接从google down下来的 zxing二维码扫描 是 在扫描界面 中间的红线是 竖着的 ,那么怎么能让它 横着 显示呢, 只 因简单几步,轻松搞定
首先讲下关键的几个类
CaptureActivity。这个是启动Activity 也就是扫描器(如果是第一安装,它还会跳转到帮助界面)。
CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
DecodeThread 解码的线程。
com.google.zxing.client.android.camera 包,摄像头控制包。
ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了
一 点开 com.google.zxing.client.android包下在DecodeHandler.java中,修改decode方法 在decode 方法中 修改 代码
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height); 把这行注释 在下方修改为:这里还是为了初学者考虑这样写
/**
* 在此修改
*/
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width; // Here we are swapping, that's the difference to #11
width = height;
height = tmp;
PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
/**
* 修改结束
*/
二 点开包com.google.zxing.client.android.camera 下 CameraManager 中 getFramingRectInPreview() 方法中 修改
// rect.left = rect.left * cameraResolution.x / screenResolution.x;
// rect.right = rect.right * cameraResolution.x / screenResolution.x;
// rect.top = rect.top * cameraResolution.y / screenResolution.y;
// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; // 修改前这四行 注释
/**
* 修改后
*/
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
三 顺便在 还在这个包中的 CameraConfigurationManager 类中的setDesiredCameraParameters方法中添加一句
第一、 void setDesiredCameraParameters(Camera camera) {
Camera.Parameters parameters = camera.getParameters();
Log.d(TAG, "Setting preview size: " + cameraResolution);
parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
setFlash(parameters);
setZoom(parameters);
camera.setParameters(parameters);
//camera.setDisplayOrientation(90);// 框框中改横线是 修改的 , 这行代码就可以注释了, 就不用了, 如果用这行代码 则会出现 极光线变成横线的时候 图像有拉伸的功能了
// 使摄像头旋转90度
setDisplayOrientation(camera, 90);
}
添加 setDisplayOrientation(camera, 90);这个方法.
/*改变照相机成像的方向的方法*/
protected void setDisplayOrientation(Camera camera, int angle) {
Method downPolymorphic = null;
try {
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[]{angle});
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
第二、
在 这个类中 的这个方法 void initFromCameraParameters(Camera camera) { 里面 在
Log.d(TAG, "Screen resolution: " + screenResolution);
下面添加如下代码
//为竖屏添加
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
}
// 下句第二参数要根据竖屏修改
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
/*cameraResolution = getCameraResolution(parameters, screenResolution);*/ 并注释zxing自带的 这行代码
四 ,在AndroidManifest.xml中,把CaptureActivity的属性android:screenOrientation="landscape"
改为
android:screenOrientation="portrait"
够详细了吧, 开发 二维码扫描的哥们 在搞不出来, 实在不知道说什么好了 。
但是在修改中存在一个问题, 若是 在上述第三个步骤中 加入 camera.setDisplayOrientation(90); 这句话报错时, 给zxing换一个核心包,若是还报错直接换个搞点版本的Android包就OK 了, 建议直接换成 高点的Android 包。
当然加入这句话不错的哥们 就不用管啦, 唉, 为了后人不走弯路,特别奉上。
相关文章推荐
- zxing横屏改为竖屏识别,多次扫描,以及存在的摄像拉伸的问题
- zxing横屏改为竖屏识别,多次扫描,以及存在的摄像拉伸的问题
- zxing 二维码扫描 解决竖屏状态下 被拉伸的问题
- 二维码扫描(横屏、竖屏、解决竖屏后拉伸问题、美化扫描框)
- 二维码识别项目zxing横屏改为竖屏
- Android使用Zxing扫描二维码过程解决三星note1竖屏后花屏问题
- 第96篇ES与一对一的整合及图像识别跨域问题解决
- zxing 黑屏 无法显示图像问题 及中文乱码问题解决
- Android开源二维码识别项目zxing横屏改为竖屏识别解决方案
- ZXing改横屏识别为竖屏识别
- Android开源二维码识别项目zxing横屏改为竖屏识别解决方案
- Android开源二维码识别项目zxing横屏改为竖屏识别解决方案
- ubuntu 触摸屏横屏变竖屏解决 触摸功能仍然是横屏的问题
- ZXing改横屏识别为竖屏识别
- ZXing改横屏识别为竖屏识别
- Android Zxing二维码扫描图片拉伸问题的解决方法
- Android开源二维码识别项目zxing横屏改为竖屏识别解决方案
- zxing图像拉伸问题解决方案
- ZXing1.6改横屏识别为竖屏识别
- Android解决Zxing识别GBK类型二维码出现乱码的问题