2017-03-22 10 views
0

저는 Xamarin Android 프로젝트를 보유하고 있으며 카메라에서 QR 코드를 인식하고 동시에 사진을 저장 장치에 저장하려고합니다. Android.Hardware.Camera.IPreviewCallback을 사용하여 카메라에서 이미지를 가져 왔습니다. 이미지 저장은 예상대로 작동하지만 QR 코드 인식이 실패합니다.ZXing 라이브러리를 사용하여 이미지에서 QR 코드를 인식하는 방법은 무엇입니까?

void Android.Hardware.Camera.IPreviewCallback.OnPreviewFrame(byte[] data, Android.Hardware.Camera camera) 
{ 
    byte[] jpegData = ConvertYuvToJpeg(data); 
    Bitmap bitmap = BytesToBitmap(jpegData); 
    SaveBitmapImage(bitmap); // This works great 


    var width = (int)_textureView.Width; 
    var height = (int)_textureView.Height; 

    // How to get LuminanceSource?? 
    //LuminanceSource source = new RGBLuminanceSource(rgbValues, bm.Width, bm.Height, RGBLuminanceSource.BitmapFormat.ARGB32); 
    //LuminanceSource source = new RGBLuminanceSource(jpegData, width, height); 
    LuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, 
     0, 0, width, height, false); 
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); 

    QRCodeReader reader = new QRCodeReader(); 
    var result = reader.decode(binaryBitmap); 
} 

전화

var result = reader.decode(binaryBitmap); 

항상 null을 반환

에 : 여기 내 코드입니다.

편집 :

카메라에 문제가있는 것 같습니다. 그것은 QR 코드에 초점을 맞추고 있지 않다. 이미지가 흐리고 ZXing 라이브러리가 그것을 디코딩 할 수 없다. 카메라 초점을 맞추려면 어떻게해야합니까?

답변

0

카메라 초점에 문제가 있습니다. 초점 모드를 설정해야합니다. 다음은 코드입니다.

var parameters = _camera.GetParameters(); 
parameters.FocusMode = GetOptimalFocusMode(parameters); 
_camera.SetParameters(parameters); 

private String GetOptimalFocusMode(Android.Hardware.Camera.Parameters parameters) 
{ 
    String result; 
    IList<String> focusModes = parameters.SupportedFocusModes; 

    if (focusModes.Contains(Android.Hardware.Camera.Parameters.FocusModeContinuousVideo)) 
    { 
     result = Android.Hardware.Camera.Parameters.FocusModeContinuousVideo; 
    } 
    else if (focusModes.Contains(Android.Hardware.Camera.Parameters.FocusModeAuto)) 
    { 
     result = Android.Hardware.Camera.Parameters.FocusModeAuto; 
    } 
    else 
    { 
     result = parameters.SupportedFocusModes.First(); 
    } 

    return result; 
}