二维码扫描库 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);

你可能感兴趣的:(二维码扫描库 ZXing 支持Portrait)