|
1 | 1 | using System.Runtime.InteropServices; |
2 | 2 | using System.Runtime.InteropServices.Marshalling; |
3 | 3 | using Windows.Graphics.Imaging; |
| 4 | +using Windows.Storage.Streams; |
4 | 5 | using ZXingCpp; |
5 | 6 |
|
6 | 7 | namespace BarcodeScanning; |
7 | 8 |
|
8 | 9 | public static partial class Methods |
9 | 10 | { |
10 | 11 | public static async Task<IReadOnlySet<BarcodeResult>> ScanFromImageAsync(byte[] imageArray) |
11 | | - => await ScanFromStreamAsync(new MemoryStream(imageArray)); |
| 12 | + { |
| 13 | + using var stream = new MemoryStream(imageArray); |
| 14 | + using var randomStream = stream.AsRandomAccessStream(); |
| 15 | + return await ProcessBitmapAsync(randomStream); |
| 16 | + } |
12 | 17 | public static async Task<IReadOnlySet<BarcodeResult>> ScanFromImageAsync(FileResult file) |
13 | | - => await ScanFromStreamAsync(await file.OpenReadAsync()); |
14 | | - public static async Task<IReadOnlySet<BarcodeResult>> ScanFromStreamAsync(Stream stream) |
15 | 18 | { |
16 | | - var decoder = await BitmapDecoder.CreateAsync(stream.AsRandomAccessStream()); |
| 19 | + using var stream = await file.OpenReadAsync(); |
| 20 | + using var randomStream = stream.AsRandomAccessStream(); |
| 21 | + return await ProcessBitmapAsync(randomStream); |
| 22 | + } |
| 23 | + public static async Task<IReadOnlySet<BarcodeResult>> ScanFromImageAsync(string url) |
| 24 | + { |
| 25 | + using var randomStream = await RandomAccessStreamReference.CreateFromUri(new Uri(url)).OpenReadAsync(); |
| 26 | + return await ProcessBitmapAsync(randomStream); |
| 27 | + } |
| 28 | + public static async Task<IReadOnlySet<BarcodeResult>> ScanFromImageAsync(Stream stream) |
| 29 | + { |
| 30 | + var randomStream = stream.AsRandomAccessStream(); |
| 31 | + return await ProcessBitmapAsync(randomStream); |
| 32 | + } |
| 33 | + |
| 34 | + private static async Task<IReadOnlySet<BarcodeResult>> ProcessBitmapAsync(IRandomAccessStream stream) |
| 35 | + { |
| 36 | + var decoder = await BitmapDecoder.CreateAsync(stream); |
17 | 37 | using var softwareBitmap = await decoder.GetSoftwareBitmapAsync(); |
18 | 38 |
|
19 | | - var bitmap = softwareBitmap.BitmapPixelFormat switch |
20 | | - { |
21 | | - BitmapPixelFormat.Bgra8 => softwareBitmap, |
22 | | - BitmapPixelFormat.Rgba8 => softwareBitmap, |
23 | | - BitmapPixelFormat.Gray8 => softwareBitmap, |
24 | | - _ => SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Gray8) |
25 | | - }; |
| 39 | + using var barcodeBitmap = |
| 40 | + softwareBitmap.BitmapPixelFormat is |
| 41 | + BitmapPixelFormat.Bgra8 or |
| 42 | + BitmapPixelFormat.Rgba8 or |
| 43 | + BitmapPixelFormat.Gray8 |
| 44 | + ? null |
| 45 | + : SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Gray8); |
| 46 | + var bitmap = barcodeBitmap ?? softwareBitmap; |
26 | 47 |
|
27 | 48 | using var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.Read); |
28 | 49 | using var reference = buffer.CreateReference(); |
|
0 commit comments