2017-03-22 22 views
0

私はXamarin Androidプロジェクトを持っています。私はカメラからQRコードを認識して、同時に画像を保存したいと思います。私はカメラから画像を取得するためにAndroid.Hardware.Camera.IPreviewCallbackを使用しました。イメージの保存は期待どおりですが、QRコードの認識は失敗します。ここに私のコードは次のとおりです。ZXingライブラリを使用して画像からQRコードを認識する方法は?

var result = reader.decode(binaryBitmap); 

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); 
} 

コールは常に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; 
} 
関連する問題