es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo leer una imagen de código de barras en Xamarin Forms

Estoy intentando leer el texto de una imagen de un código QR en mi aplicación móvil. Estoy utilizando Xamarin.Forms con el paquete NuGet de ZXing.

He logrado obtener el archivo utilizando “Xamarin.Essentials FilePicker”. Pero no sé cómo leer realmente el código de barras. He revisado algunas soluciones en Stackoverflow y todas parecen estar basadas en Xamarin.Android (usando objetos BinaryBitmap). Necesito una solución que funcione también para iOS y UWP. Esto es lo que tengo hasta ahora:

“`
string file = "";
var filePickerOptions = new PickOptions
{
PickerTitle = "Seleccionar imagen de código de barras",
FileTypes = FilePickerFileType.Images
};
var result = await FilePicker.PickAsync(filePickerOptions);
if (result != null)
{
file = result.FullPath;
var res = Decode(file, BarcodeFormat.QR_CODE);
Console.WriteLine(res.Text);
}

public Result Decode(string file, BarcodeFormat? format = null, KeyValuePair<decodehinttype, object="">[] aditionalHints = null)
{
var r = GetReader(format, aditionalHints);
/* Necesito alguna función aquí que me permita obtener BinaryBitmap a partir de la ruta de la imagen o algo similar. */
var image = GetBinaryBitmap(file);
var result = r.decode(image);
return result;
}

MultiFormatReader GetReader(BarcodeFormat? format, KeyValuePair<decodehinttype, object="">[] aditionalHints)
{
var reader = new MultiFormatReader();

<pre><code>var hints = new Dictionary<decodehinttype, object="">();

if (format.HasValue)
{
hints.Add(DecodeHintType.POSSIBLE_FORMATS, new List<barcodeformat>() { format.Value });
}
if (aditionalHints != null)
{
foreach (var ah in aditionalHints)
{
hints.Add(ah.Key, ah.Value);
}
}

reader.Hints = hints;

return reader;
</code></pre>

}
“`</decodehinttype,></decodehinttype,></decodehinttype,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para leer el código de barras de una imagen de código QR en una aplicación móvil utilizando Xamarin.Forms con el paquete ZXing NuGet, necesitas usar Xamarin.Essentials FilePicker para obtener el archivo, y luego utilizar la función Decode para decodificar el texto. Sin embargo, necesitas escribir una función que te permita obtener BinaryBitmap a partir de la ruta del archivo de imagen o algo similar.

    Para comenzar, necesitas definir la variable file y utilizar la función PickAsync para obtener el archivo:

    string file = "";
    var filePickerOptions = new PickOptions
    {
        PickerTitle = "Seleccionar imagen de código de barras",
        FileTypes = FilePickerFileType.Images
    };
    var result = await FilePicker.PickAsync(filePickerOptions);
    if (result != null)
    {
        file = result.FullPath;
        var res = Decode(file, BarcodeFormat.QR_CODE);
        Console.WriteLine(res.Text);
    }
    

    Después de eso, necesitas definir las funciones Decode y GetReader. La función Decode recibe la ruta del archivo de imagen, un BarcodeFormat y pistas adicionales como parámetros. Dado que estás utilizando un código QR, puedes pasar BarcodeFormat.QR_CODE. También necesitas escribir una función que te permita obtener BinaryBitmap a partir de la ruta del archivo de imagen:

    public Result Decode(string file, BarcodeFormat? format = null, KeyValuePair<decodehinttype, object="">[] aditionalHints = null)
    {
        var r = GetReader(format, aditionalHints);
    
        var bitmap = GetBinaryBitmap(file);
        var result = r.decode(bitmap);
        return result;
    }
    
    BinaryBitmap GetBinaryBitmap(string file)
    {
        var bytes = File.ReadAllBytes(file);
        var image = new BitmapImage(new Uri(file));
        var writable = new WriteableBitmap(image.PixelWidth, image.PixelHeight);
        image.WritePixels(new Int32Rect(0, 0, image.PixelWidth, image.PixelHeight), bytes, image.PixelWidth * 4, 0);
        return new BinaryBitmap(new HybridBinarizer(new WriteableBitmapLuminanceSource(writable)));
    }
    

    Finalmente, la función GetReader crea un nuevo objeto MultiFormatReader y establece las pistas. Si hay un parámetro BarcodeFormat, agrega el formato a las pistas. Si hay pistas adicionales, también las agrega a las pistas:

    MultiFormatReader GetReader(BarcodeFormat? format, KeyValuePair<decodehinttype, object="">[] aditionalHints)
    {
        var reader = new MultiFormatReader();
    
        var hints = new Dictionary<decodehinttype, object="">();
    
        if (format.HasValue)
        {
            hints.Add(DecodeHintType.POSSIBLE_FORMATS, new List<barcodeformat>() { format.Value });
        }
        if (aditionalHints != null)
        {
            foreach (var ah in aditionalHints) 
            {
                hints.Add(ah.Key, ah.Value);
            }
        }
    
        reader.Hints = hints;
    
        return reader;
    }
    

    Con estas funciones, ahora puedes leer el texto de una imagen de código QR en tu aplicación móvil utilizando Xamarin.Forms con el paquete ZXing NuGet.</decodehinttype,></decodehinttype,></decodehinttype,>

Comments are closed.