using System;
using System.Drawing;
using System.IO;
using System.Windows.Media.Imaging;
using CamBooth.App.Core.Logging;
using QRCoder;
namespace CamBooth.App.Features.PhotoPrismUpload;
///
/// Service für die Generierung von QR-Codes als BitmapImage (PhotoPrism)
///
public class QRCodeGenerationService
{
private readonly Logger _logger;
public QRCodeGenerationService(Logger logger)
{
_logger = logger;
}
///
/// Generiert einen QR-Code basierend auf einem URL-String
///
/// Die Daten für den QR-Code (z.B. URL)
/// Größe in Pixeln pro QR-Code-Modul
/// BitmapImage des QR-Codes oder null bei Fehler
public BitmapImage? GenerateQRCode(string qrData, int pixelsPerModule = 20)
{
try
{
_logger.Debug($"Generiere PhotoPrism QR-Code für: {qrData}");
using (QRCodeGenerator qrGenerator = new QRCodeGenerator())
{
QRCodeData qrCodeData = qrGenerator.CreateQrCode(qrData, QRCodeGenerator.ECCLevel.Q);
using (QRCode qrCode = new QRCode(qrCodeData))
{
Bitmap qrCodeImage = qrCode.GetGraphic(pixelsPerModule, System.Drawing.Color.Black, System.Drawing.Color.White, true);
// Konvertiere Bitmap zu BitmapImage
BitmapImage bitmapImage = ConvertBitmapToBitmapImage(qrCodeImage);
_logger.Debug("✅ PhotoPrism QR-Code erfolgreich generiert");
return bitmapImage;
}
}
}
catch (Exception ex)
{
_logger.Error($"Fehler beim Generieren des PhotoPrism QR-Codes: {ex.Message}");
return null;
}
}
///
/// Konvertiert ein System.Drawing.Bitmap zu einem WPF BitmapImage
///
private BitmapImage ConvertBitmapToBitmapImage(Bitmap bitmap)
{
using (var stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Seek(0, SeekOrigin.Begin);
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = stream;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
return bitmapImage;
}
}
}