我正在尝试从 .png文件导入 QR码,并使用Zxing.Net.Mobile和ZXing.Net.Mobile.Forms对其进行解码。
如果我使用ZXing.Mobile.MobileBarcodeScanner
类扫描QR码,则解码按要求工作,但是,从文件导入时,Qr代码阅读器(ZXing.QrCode.QRCodeReader()
)解码函数始终返回{{ 1}}。
我正在使用 Xamarin Forms ;每个平台处理位图/图像创建,便携式部分处理其余部分(null
创建和解码)。
Zxing BinaryBitmap
//Store rawBytes and image demensions
PotableBitmap bMap = DependencyService.Get<IBitmap>().FileToBitmap(filePath);
RGBLuminanceSource source = new RGBLuminanceSource(bMap.RgbBytes, bMap.Width, bMap.Height, RGBLuminanceSource.BitmapFormat.RGB32);
HybridBinarizer binarized = new HybridBinarizer(source);
BinaryBitmap bitmap = new BinaryBitmap(binarized);
var reader = new ZXing.QrCode.QRCodeReader();
data = reader.decode(qrCodeBitmap); // This is always null
将调用平台特定功能,在我与Andorid合作的那一刻,功能如下:
DependencyService
我已经浏览了一些有关同样问题的帖子,并尝试了以下内容:
public PortableBitmap FileToBitmap(string ms)
{
var bytes = File.ReadAllBytes(ms);
Android.Graphics.Bitmap bMap = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length);
int[] intArray = new int[bMap.Width * bMap.Height];
bMap.GetPixels(intArray, 0, bMap.Width, 0, 0, bMap.Width, bMap.Height)
List<byte> result = new List<byte>();
foreach (int intRgb in intArray)
{
Color pixelColor = new Color(intRgb);
result.Add(pixelColor.R);
result.Add(pixelColor.G);
result.Add(pixelColor.B);
}
return new PortableBitmap(result.ToArray(), bMap.Width, bMap.Height);
}
:仍然会返回BitmapLuminanceSource
并需要使用其他库null
使用不同的位图格式:RGB32,BGR32,ARGB32,ABGR32(每次更改FileToBitmap函数)RGBLuminanceSource
,Binarizer
GlobalHistogramBinarizer()
与纯条形码一起使用并尝试更难提示这是返回MultiFormatReader()
的地方:
null
在线Zxing decoder可以解码我正确测试的QR码。这是我的测试二维码:
答案 0 :(得分:0)
我解决了这个问题,在Android实现中使用这个方法从图像的路径返回一个RGBLuminanceSource
public RGBLuminanceSource GetRGBLuminanceSource(string imagePath)
{
if (File.Exists(imagePath))
{
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 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.ARGB32);
}
return null;
}