QRReaderFromAndroid/MainWindow.xaml.cs

137 lines
4.7 KiB
C#

using OpenCvSharp;
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using ZXing;
using ZXing.OpenCV;
using System.Windows.Media;
using System.Drawing;
using System.IO;
using ZXing.Common; // Para DecodingOptions y otros
using ZXing.Windows.Compatibility;
using BarcodeReader = ZXing.OpenCV.BarcodeReader; // Asegúrate de añadir este using
namespace QRReaderFromAndroid
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : System.Windows.Window
{
private VideoCapture _capture;
private BarcodeReader _reader;
private HashSet<string> _scannedBarcodes = new HashSet<string>();
private const string FilePath = "scanned_barcodes.txt";
public MainWindow()
{
InitializeComponent();
_reader = new BarcodeReader();
_capture = new VideoCapture(0);
_capture.FrameWidth = 640;
_capture.FrameHeight = 480;
CompositionTarget.Rendering += UpdateFrame;
LoadScannedBarcodes();
}
public static BitmapSource MatToBitmapSource(Mat mat)
{
var bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
var bitmapData = bitmap.LockBits(
new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
var bitmapSource = BitmapSource.Create(
bitmapData.Width, bitmapData.Height,
bitmap.HorizontalResolution, bitmap.VerticalResolution,
System.Windows.Media.PixelFormats.Bgr24, null,
bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);
bitmap.UnlockBits(bitmapData);
bitmap.Dispose();
return bitmapSource;
}
private void UpdateFrame(object sender, EventArgs e)
{
using (var frame = new Mat())
{
_capture.Read(frame);
if (!frame.Empty())
{
var bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(frame);
var result = ScanBarcode(bitmap);
if (result != null && result.Text.Length == 13 && _scannedBarcodes.Add(result.Text))
{
// Actualizar UI de forma segura
Dispatcher.Invoke(() =>
{
barcodeList.Items.Add(result.Text);
barcodeText.Text = $"Scanned: {result.Text}";
});
SaveBarcode(result.Text);
}
cameraImage.Source = BitmapToImageSource(bitmap);
}
}
}
private void LoadScannedBarcodes()
{
if (File.Exists(FilePath))
{
var barcodes = File.ReadAllLines(FilePath).Where(code => code.Length == 13);
foreach (var barcode in barcodes)
{
_scannedBarcodes.Add(barcode);
barcodeList.Items.Add(barcode);
}
}
}
private Result ScanBarcode(Bitmap bitmap)
{
var barcodeReader = new BarcodeReaderGeneric
{
AutoRotate = true,
Options = new ZXing.Common.DecodingOptions { TryHarder = true }
};
var luminanceSource = new BitmapLuminanceSource(bitmap);
var result = barcodeReader.Decode(luminanceSource);
return result;
}
private BitmapSource BitmapToImageSource(Bitmap bitmap)
{
using (var memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
return bitmapImage;
}
}
private void SaveBarcode(string barcode)
{
string filePath = "scanned_barcodes.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
sw.WriteLine(barcode);
}
}
protected override void OnClosed(EventArgs e)
{
_capture.Release();
_capture.Dispose();
CompositionTarget.Rendering -= UpdateFrame;
base.OnClosed(e);
}
}
}