You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
74 lines
1.9 KiB
/* |
|
* Copyright 2024 Axel Waggershauser |
|
*/ |
|
// SPDX-License-Identifier: Apache-2.0 |
|
|
|
using System.Collections.Generic; |
|
using ImageMagick; |
|
using SkiaSharp; |
|
using ZXingCpp; |
|
|
|
public static class MagickImageBarcodeReader |
|
{ |
|
public static Barcode[] Read(MagickImage img, ReaderOptions? opts = null) |
|
{ |
|
if (img.DetermineBitDepth() < 8) |
|
img.SetBitDepth(8); |
|
var bytes = img.ToByteArray(MagickFormat.Gray); |
|
var iv = new ImageView(bytes, (int)img.Width, (int)img.Height, ImageFormat.Lum); |
|
return BarcodeReader.Read(iv, opts); |
|
} |
|
|
|
public static Barcode[] From(this BarcodeReader reader, MagickImage img) => Read(img, reader); |
|
} |
|
|
|
public static class SkBitmapBarcodeReader |
|
{ |
|
public static Barcode[] Read(SKBitmap img, ReaderOptions? opts = null) |
|
{ |
|
var format = img.Info.ColorType switch |
|
{ |
|
SKColorType.Gray8 => ImageFormat.Lum, |
|
SKColorType.Rgba8888 => ImageFormat.RGBA, |
|
SKColorType.Bgra8888 => ImageFormat.BGRA, |
|
_ => ImageFormat.None, |
|
}; |
|
if (format == ImageFormat.None) |
|
{ |
|
if (!img.CanCopyTo(SKColorType.Gray8)) |
|
throw new Exception("Incompatible SKColorType"); |
|
img = img.Copy(SKColorType.Gray8); |
|
format = ImageFormat.Lum; |
|
} |
|
var iv = new ImageView(img.GetPixels(), img.Info.Width, img.Info.Height, format); |
|
return BarcodeReader.Read(iv, opts); |
|
} |
|
|
|
public static Barcode[] From(this BarcodeReader reader, SKBitmap img) => Read(img, reader); |
|
} |
|
|
|
public class Program |
|
{ |
|
public static void Main(string[] args) |
|
{ |
|
#if false |
|
var img = new MagickImage(args[0]); |
|
#else |
|
var img = SKBitmap.Decode(args[0]); |
|
#endif |
|
Console.WriteLine(img); |
|
|
|
var readBarcodes = new BarcodeReader() { |
|
TryInvert = false, |
|
ReturnErrors = true, |
|
}; |
|
|
|
if (args.Length >= 2) |
|
readBarcodes.Formats = BarcodeFormats.Parse(args[1]); |
|
else |
|
readBarcodes.Formats = BarcodeFormat.AllReadable; |
|
|
|
foreach (var b in readBarcodes.From(img)) |
|
Console.WriteLine($"{b.Format} ({b.Symbology} / {b.ContentType}): {b.Text} / [{string.Join(", ", b.Bytes)}] {b.ErrorMsg}"); |
|
} |
|
}
|
|
|