Список поддерживаемых форматов весьма внушителен и включает в себя: EAN-8 и EAN-13, QR Code, UPC-A и UPC-E, Code 39, Code 93, Code 128 и другие.
Также имеется порт для WinRT, а значит библиотеку можно использовать с универсальной платформой Windows. PCL для распознавания штрих-кода называется ZXing.Net Кажется, название намекает на то, что вы также можете использовать эту библиотеку с приложениями .
Net. На что мне сразу пришлось обратить внимание.
Если мы делаем простую фотографию, мы обычно не утруждаем себя и просто фотографируем.
Если мы обрабатываем какое-либо изображение, то необходимо, чтобы качество изображения было наилучшим.
Поэтому при инициализации камеры необходимо установить максимально возможное разрешение.
Для этого мы используем код, аналогичный коду примера: Пример разрешения камеры Кроме того, вам необходимо определить, имеется ли в устройстве передняя или задняя камера.
Это не сложно:
Затем вы можете инициализировать захват мультимедиа:var devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); DeviceInformation frontCamera = null; DeviceInformation rearCamera = null; foreach (var device in devices) { switch (device.EnclosureLocation.Panel) { case Windows.Devices.Enumeration.Panel.Front: frontCamera = device; break; case Windows.Devices.Enumeration.Panel.Back: rearCamera = device; break; } }
if (rearCamera != null)
{
await mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings { VideoDeviceId = rearCamera.Id });
}
Разрешение установлено следующее:
public async Task SetResolution()
{
System.Collections.Generic.IReadOnlyList<IMediaEncodingProperties> res;
res = mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo);
uint maxResolution = 0;
int indexMaxResolution = 0;
if (res.Count >= 1)
{
for (int i = 0; i < res.Count; i++)
{
VideoEncodingProperties vp = (VideoEncodingProperties)res[i];
if (vp.Width > maxResolution)
{
indexMaxResolution = i;
maxResolution = vp.Width;
}
}
await mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, res[indexMaxResolution]);
}
}
Захват и распознавание изображений будут выглядеть примерно так:
IRandomAccessStream fileStream = new InMemoryRandomAccessStream();
await mediaCapture.CapturePhotoToStreamAsync(Windows.Media.MediaProperties.ImageEncodingProperties.CreateBmp(), fileStream);
string res = await BarcodeDecoder.DecodeStreamToBarcode(fileStream);
Класс используется для распознавания потока Декодер штрих-кода , который был взят из Майк Толти Код класса скрыт под спойлером.
internal static class BarcodeDecoder
{
static BarcodeReader barcodeReader;
static BarcodeDecoder()
{
barcodeReader = new ZXing.BarcodeReader();
barcodeReader.Options.PureBarcode = false;
barcodeReader.Options.Hints.Add(DecodeHintType.TRY_HARDER, true);
barcodeReader.Options.PossibleFormats = new BarcodeFormat[] { BarcodeFormat.QR_CODE,BarcodeFormat.All_1D };
barcodeReader.Options.TryHarder = true;
barcodeReader.AutoRotate = true;
}
public async static Task<string> DecodeStreamToBarcode(IRandomAccessStream photoStream)
{
BitmapDecoder bitmapDecoder = await BitmapDecoder.CreateAsync(photoStream);
BitmapTransform emptyBitmapTransform = new BitmapTransform();
PixelDataProvider pixelDataProvider = await bitmapDecoder.GetPixelDataAsync(
BitmapPixelFormat.Rgba8,
BitmapAlphaMode.Premultiplied,
emptyBitmapTransform,
ExifOrientationMode.RespectExifOrientation,
ColorManagementMode.DoNotColorManage);
var zxingResult = barcodeReader.Decode(pixelDataProvider.DetachPixelData(),
(int)bitmapDecoder.PixelWidth, (int)bitmapDecoder.PixelHeight, BitmapFormat.RGBA32);
string res = "";
if (!String.IsNullOrEmpty(zxingResult?.
Text)) res = zxingResult?.
Text;
return res;
}
}
Этот класс распознает штрих-коды в форматах QR_CODE и All_1D. Кроме того, All_1D включает в себя следующие форматы: UPC-A, UPC-E, EAN-8 и EAN-13. Вы можете добавить другие форматы.
Допустим, используемый нами декодер поддерживает следующие форматы: UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, ITF, Codabar, MSI, RSS-14 (все варианты).
, QR-код, Data Matrix, Aztec и PDF-417 Этот метод распознавания хорошо подходит для существующих изображений.
Если вы пользуетесь фотоаппаратом, вам придется сделать много фотографий, пока не получится удачная, узнаваемая фотография.
Другими словами, первый блин получился комом, но кое-какой полезный опыт был получен.
Распознавание кода на лету
В результате интенсивных поисков был найден следующий репозиторий ВидеоСканированиеZXingWinRT , который был взят за основу.Изображение захватывается из режима предварительного просмотра.
Тут я, немного с опозданием, понял, что камера без возможности фокусировки не сможет сделать нормальную макросъёмку.
Теоретически можно попробовать отсканировать штрих-код телефонами с камерами без автофокуса, но шансы невелики.
Вы можете попробовать это сами.
Камеры с фокусировкой могут поддерживать автофокусировку или могут фокусироваться в ручном режиме.
Для ручного режима я устанавливаю автофокусировку по таймеру каждые 3 секунды.
Кроме того, была отключена подсветка, которая создавала блики и мешала распознаванию.
if (mediaCapture.VideoDeviceController.FlashControl.Supported) mediaCapture.VideoDeviceController.FlashControl.Auto = false;
В результате удаления лишнего и внесения исправлений получился следующий пример: Barcode_Scanner_UWP
Приглашаю всех присоединиться к проекту.
Буду рад улучшениям и корректировкам.
Чтобы использовать его в своем проекте, вам необходимо добавить пользовательский элемент управления BarcodeScannerControl.xaml вместе с кодом C#.
Затем в код страницы, с которой будет происходить вызов (в примере это MainPage.xaml), добавьте Popup с User Control внутри <Popup x:Name="BarcodePopup" IsOpen="False" IsLightDismissEnabled="False">
<Grid>
<local:BarcodeScannerControl x:Name="barcodecontrol" Width="{Binding ElementName=MainGrid,Path=ActualWidth}"
Height="{Binding ElementName=MainGrid,Path=ActualHeight}"></local:BarcodeScannerControl>
</Grid>
</Popup>
В этом случае ширина и высота пользовательского элемента управления привязаны к размерам элемента контейнера окна с именем MainGrid.
Вам нужно добавить 2 метода в ваш код C#.
Один будет вызван в случае успешного поиска штрих-кода, второй – в случае ошибки.
Сигнатуры методов таковы, что параметр одного — строка, параметр второго — исключение.
В примере это недействительно BarcodeFound (строковый штрих-код) И void OnError (Исключение е) .
Теперь вы можете открыть Popup и выполнить метод, который запускает предварительный просмотр изображения с камеры и сканирование штрих-кода: BarcodePopup.IsOpen = true;
await barcodecontrol.StartScan(BarcodeFound, OnError);
Следует помнить о жизненном цикле приложения UWP. В нашем случае, если приложение перешло в состояние «приостановлено», необходимо остановить процесс просмотра изображения с камеры, поиска штрих-кода и закрыть Popup. То есть добавьте этот код: private async void App_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
await barcodecontrol.Cleanup();
BarcodePopup.IsOpen = false;
deferral.Complete();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Application.Current.Suspending += App_Suspending;
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
Application.Current.Suspending -= App_Suspending;
}
Теперь о минусах.
Есть один минус — библиотека ZXing.Net не обновляется уже 2 года.
Хотя, с другой стороны, если оно работает без ошибок и новые возможности не нужны, то, возможно, в этом нет ничего плохого.
Проект неофициальный, поэтому работа над ним происходит, когда у разработчиков есть свободное время.
Сайт старой школы Кодплекс Оно подаёт признаки жизни.
Там же вы можете найти исходный код. Хорошая новость в том, что саму библиотеку в ближайшее время планируется обновить, то есть проект не заброшен.
Теги: #zxing #uwp #qr-code #barcodes #barcode #QR #barcode #recognition #qrcode #.
NET #Обработка изображений #Разработка для Windows Phone #C++ #Разработка для Windows
-
Как Создавать 3D-Модели Видеоигр
19 Oct, 24 -
Кори Доктороу, «Маленький Брат»
19 Oct, 24 -
Почтовое Отделение. Финал
19 Oct, 24 -
Chrome Занял Первое Место В России
19 Oct, 24 -
Подкаст Unclesoky - Эпизод №24
19 Oct, 24 -
Блоглайны Решили Технические Проблемы
19 Oct, 24 -
Футбольный Мяч И Фуллерены
19 Oct, 24