扫描图库中的图像时,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 中使用 Acr.XamForms Nuget 访问相机和图库的示例代码 [关闭]
如何将 PageRenderer/Fragment/View 中的 ZXing 扫描仪嵌入 Xamarin.Forms ContentPage?