扫描图库中的图像时,Xamarin.Forms ZXing BarcodeReaderGeneric 返回 null

Posted

技术标签:

【中文标题】扫描图库中的图像时,Xamarin.Forms ZXing BarcodeReaderGeneric 返回 null【英文标题】:Xamarin.Forms ZXing BarcodeReaderGeneric returns null when scanning an image in the gallery 【发布时间】:2021-07-09 05:21:17 【问题描述】:

我正在使用 Xamarin.Forms 开发条形码阅读器。我正在尝试在 android 设备上扫描图像。

首先,我使用 Xamarin.Essentials MediaPicker 从图库中选择图像,并从该图像的路径中获得一个带有 Dependency 类的 RGBLuminance。

然后我尝试使用 ZXing BarcodeReaderGeneric 类的 Decode() 方法解码此 RGBLuminance。但是,结果总是返回 null。

这是我的演示项目:https://onedrive.live.com/?authkey=%21AFLjjM91wgZkBGU&cid=58BE2C2C3447FFA2&id=58BE2C2C3447FFA2%219829&parId=root&action=locate

ViewModel 类中的命令:

        public ICommand PickCommand => new Command(PickImage);
        private async void PickImage()
        
            var pickResult = await MediaPicker.PickPhotoAsync(new MediaPickerOptions
            
                Title = "Select a barcode."
            );
            var path = pickResult.FullPath;

            var RGBLuminance = DependencyService.Get<ILuminance>().GetRGBLuminanceSource(path);
            var reader = new BarcodeReaderGeneric();
            var result = reader.Decode(RGBLuminance); // result always null.
        

Android中的依赖类方法:

        public RGBLuminanceSource GetRGBLuminanceSource(string imagePath)
        
            
            if (File.Exists(imagePath))
            
                Android.Graphics.Bitmap bitmap = BitmapFactory.DecodeFile(imagePath);
                List<byte> rgbBytesList = new List<byte>();
                for (int y = 0; y < bitmap.Height; y++)
                
                    for (int x = 0; x < bitmap.Width; x++)
                    
                        var c = new Android.Graphics.Color(bitmap.GetPixel(x, y));
                        rgbBytesList.AddRange(new[]  c.A, c.R, c.G, c.B );
                    
                
                byte[] rgbBytes = rgbBytesList.ToArray();
                return new RGBLuminanceSource(rgbBytes, bitmap.Height, bitmap.Width, RGBLuminanceSource.BitmapFormat.RGB32);
            
            return null;
        

【问题讨论】:

嗨@Serkan Seker,您能否发布有关此问题的完整错误日志?它将为我们提供解决问题的线索。如果您方便的话,能否请您将基本演示发布到 githhub 或 onedriver 以便我们进行测试? 嗨@JessieZhang-MSFT 我准备了一个演示项目。 onedrive.live.com/… 【参考方案1】:

你应该换行

return new RGBLuminanceSource(rgbBytes, bitmap.Height, bitmap.Width, RGBLuminanceSource.BitmapFormat.RGB32);

return new RGBLuminanceSource(rgbBytes, bitmap.Width, bitmap.Height, RGBLuminanceSource.BitmapFormat.RGB32);

为了更准确地使用 RGB 格式,您应该

将 RGBLuminanceSource.BitmapFormat.RGB32 更改为 RGBLuminanceSource.BitmapFormat.ARGB32 或更改 rgbBytesList.AddRange(new[] c.A, c.R, c.G, c.B );到 rgbBytesList.AddRange(new[] c.R, c.G, c.B, c.A );

【讨论】:

谢谢。扫描条码时不同的BitmapFormat会影响结果吗? 视情况而定。 RGB32 模式下的亮度源使用前三个字节作为 R、G 和 B 通道。第四个字节(alpha 通道)被忽略。如果您以 ARGB 顺序构建数组,则 alpha 值将被解释为红色通道,红色通道为绿色,绿色通道为蓝色,蓝色通道将被忽略。这会导致不同的灰度图像,并且在某些情况下会导致不同的单色位矩阵。一些可能对比度低或类似的图像可能会失败。 涵盖所有条形码类型的最佳 BitmapFormat 设置是什么?提供黑白和彩色条码。 条码类型不依赖于位图格式。您必须选择适合您的字节数组的格式。您也可以使用 android 绑定包nuget.org/packages/ZXing.Net.Bindings.Android 中的条码阅读器类 ZXing.Android.BarcodeReader。在这种情况下,您的代码将如下所示: ´´´ if (File.Exists(imagePath)) Android.Graphics.Bitmap bitmap = BitmapFactory.DecodeFile(imagePath); var reader = new ZXing.Android.BarcodeReader(); var 结果 = reader.Decode(位图); ´´´ 我不明白的是,一个内容相同的不同大小的图像被正确解码,而另一个返回null。为什么会这样?【参考方案2】:

你可以试试这张照片吗?

Picture One Picture Two

【讨论】:

以上是关于扫描图库中的图像时,Xamarin.Forms ZXing BarcodeReaderGeneric 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 xamarin.forms 中的图像大小?

Xamarin.Forms - 页面缓存

在 Xamarin.Forms 中使用 Acr.XamForms Nuget 访问相机和图库的示例代码 [关闭]

如何将 PageRenderer/Fragment/View 中的 ZXing 扫描仪嵌入 Xamarin.Forms ContentPage?

Xamarin Forms QR 码扫描仪黑屏

从UWP库中加载图标作为Xamarin.Forms中的图像