我正在用Xamarin开发条形码阅读器。表格。我正在尝试在安卓设备上扫描图像。
首先,我从Xamarin的图库中选择图像。Essentials MediaPicker,从这个图像的路径中,我得到了一个带有Dependency类的RGBLuminance。
然后,我尝试使用ZXingBarcodeReaderGeneric类的decode((方法来解码此RGBLuminance。但是,结果总是返回null。
这是我的演示项目:https://onedrive.live.com/?authkey=%21AFLjjM91wgZkBGU&cid=58BE2C2C3447FFA2&id=58BE2C3447FFA2%221829&parId=根&动作=定位
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.
}
安卓系统中依赖类的方法:
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;
}
您应该更改行
return new RGBLuminanceSource(rgbBytes, bitmap.Height, bitmap.Width, RGBLuminanceSource.BitmapFormat.RGB32);
至
return new RGBLuminanceSource(rgbBytes, bitmap.Width, bitmap.Height, RGBLuminanceSource.BitmapFormat.RGB32);
为了更准确的RGB格式,你应该
- 更改RGBLuminanceSource。位图格式。RGB32至RGB光源。位图格式。ARGB32
- 或更改rgbBytesList。AddRange(new[]{c.A,c.R,c.G,c.B}(;到rgbBytesList。AddRange(new[]{c.R,c.G,c.B,c.A}(
你能试试这些照片吗?
图片一图二