二维码扫描库 ZXing 支持Portrait

I have seen solutions on web but there isn't a completed one.Here is how I put the solutions into a piece and make it works.

Step1: Add following lines to rotate data before buildLuminanceSource(..) in decode(byte[] data,int width, int height)

DecodeHandler.java:

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;

width = height;

height = tmp;

 

PlanarYUVLuminanceSourcesource = activity.getCameraManager().buildLuminanceSource(rotatedData, width,height);


Step2: Modify getFramingRectInPreview().

CameraManager.java

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;


Step3: Disable the check for Landscape Mode in initFromCameraParameters(...)

CameraConfigurationManager.java

//remove thefollowing

if (width <height) {

  Log.i(TAG, "Display reports portraitorientation; assuming this is incorrect");

  int temp = width;

  width = height;

  height = temp;

}


Step4: Add following line to rotate camera insetDesiredCameraParameters(...)

CameraConfigurationManager.java

camera.setDisplayOrientation(90);


Step5: Do not forget to set orientation of activity to portrait. I.e: manifest

 

 

5.CameraConfigurationManager中的initFromCameraParameters()方法的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);

 

如果想把摄像头的取景框长宽设成一样(感觉取景框有点小的话),可以进行如下修改

把在CameraManager.javagetFramingRect方法中把

framingRect= new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);

替换成

framingRect= new Rect(leftOffset, topOffset, leftOffset + width, topOffset + width);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值