diff --git a/Controllers/QRController.cs b/Controllers/QRController.cs index 676492f..7784cd6 100644 --- a/Controllers/QRController.cs +++ b/Controllers/QRController.cs @@ -300,6 +300,10 @@ namespace QRRapidoApp.Controllers var requestId = Guid.NewGuid().ToString("N")[..8]; var userId = User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; var isAuthenticated = User?.Identity?.IsAuthenticated ?? false; + + // DEBUG: Log detalhado dos parâmetros recebidos + _logger.LogInformation("🔍 [DEBUG] GenerateRapidWithLogo called - RequestId: {RequestId}, ApplyLogoColorization: {ApplyLogoColorization}, LogoSizePercent: {LogoSizePercent}, HasLogo: {HasLogo}", + requestId, request.ApplyLogoColorization, request.LogoSizePercent, request.HasLogo); using (_logger.BeginScope(new Dictionary { diff --git a/Services/QRRapidoService.cs b/Services/QRRapidoService.cs index 92f6867..e8f872f 100644 --- a/Services/QRRapidoService.cs +++ b/Services/QRRapidoService.cs @@ -265,7 +265,12 @@ namespace QRRapidoApp.Services })); using var outputStream = new MemoryStream(); - resizedImage.Save(outputStream, new PngEncoder()); + // Preservar formato e cores originais ao redimensionar + resizedImage.Save(outputStream, new PngEncoder + { + ColorType = PngColorType.RgbWithAlpha, + CompressionLevel = PngCompressionLevel.DefaultCompression + }); var resizedBytes = outputStream.ToArray(); _logger.LogInformation("Logo redimensionado: {OriginalSize} -> {NewSize} bytes", @@ -491,13 +496,16 @@ namespace QRRapidoApp.Services var backgroundY = (qrImage.Height - backgroundSize) / 2; // MELHORIA: Aplicar colorização se solicitado - _logger.LogDebug("Processing logo - Apply colorization: {ApplyColorization}", - request.ApplyLogoColorization); + _logger.LogInformation("🎨 [LOGO DEBUG] Processing logo - ApplyColorization: {ApplyColorization}, PrimaryColor: {PrimaryColor}", + request.ApplyLogoColorization, request.PrimaryColor); using Image finalLogo = request.ApplyLogoColorization ? ApplyLogoColorization(logoImage, request.PrimaryColor) : logoImage.Clone(ctx => { }); // Create a copy to avoid disposing the original + _logger.LogInformation("🎨 [LOGO DEBUG] Logo processing path: {Path}", + request.ApplyLogoColorization ? "COLORIZED" : "ORIGINAL_COLORS"); + if (finalLogo == null) { _logger.LogError("Final logo is null after processing, cannot apply logo overlay"); @@ -531,7 +539,11 @@ namespace QRRapidoApp.Services // Convert back to byte array _logger.LogDebug("Saving final image with logo overlay"); using var outputStream = new MemoryStream(); - finalImage.Save(outputStream, new PngEncoder()); + finalImage.Save(outputStream, new PngEncoder + { + ColorType = PngColorType.RgbWithAlpha, + CompressionLevel = PngCompressionLevel.DefaultCompression + }); var result = outputStream.ToArray(); _logger.LogInformation("Logo overlay completed successfully - Final image size: {FinalSize} bytes", @@ -570,7 +582,7 @@ namespace QRRapidoApp.Services _logger.LogDebug("Creating colorized image with dimensions {Width}x{Height}", originalLogo.Width, originalLogo.Height); - // Apply colorization by processing each pixel + // Apply intelligent colorization: preserve light backgrounds, colorize dark elements var colorizedLogo = originalLogo.Clone(ctx => { ctx.ProcessPixelRowsAsVector4((span, point) => @@ -578,19 +590,36 @@ namespace QRRapidoApp.Services for (int x = 0; x < span.Length; x++) { var pixel = span[x]; - // Preserve alpha, but colorize RGB channels based on luminance + + // Calculate luminance (brightness) of the pixel var luminance = (pixel.X * 0.299f + pixel.Y * 0.587f + pixel.Z * 0.114f); - span[x] = new Vector4( - rgba.R / 255f * luminance, - rgba.G / 255f * luminance, - rgba.B / 255f * luminance, - pixel.W // Preserve alpha - ); + + // Define threshold for "background" vs "content" + // Values above 0.8 (bright) are considered background and preserved + var brightnessThreshold = 0.8f; + + if (luminance > brightnessThreshold) + { + // Preserve bright pixels (background) - keep original colors + span[x] = pixel; + } + else + { + // Colorize dark pixels (content/drawings) with QR color + // Use inverse luminance for intensity (darker pixels get more color) + var intensity = Math.Max(0.1f, 1.0f - luminance); + span[x] = new Vector4( + rgba.R / 255f * intensity, + rgba.G / 255f * intensity, + rgba.B / 255f * intensity, + pixel.W // Preserve alpha + ); + } } }); }); - _logger.LogDebug("Logo colorization completed successfully"); + _logger.LogInformation("✨ Smart logo colorization completed - Preserving bright pixels (>0.8), colorizing dark content with {Color}", targetColor); return colorizedLogo; } catch (Exception ex) diff --git a/wwwroot/js/qr-speed-generator.js b/wwwroot/js/qr-speed-generator.js index 3395c28..d05df0e 100644 --- a/wwwroot/js/qr-speed-generator.js +++ b/wwwroot/js/qr-speed-generator.js @@ -573,8 +573,8 @@ class QRRapidoGenerator { // NOVOS PARÂMETROS DE LOGO APRIMORADO const logoSettings = this.getLogoSettings(); - formData.append('logoSizePercent', logoSettings.logoSizePercent.toString()); - formData.append('applyLogoColorization', logoSettings.applyColorization.toString()); + formData.append('LogoSizePercent', logoSettings.logoSizePercent.toString()); + formData.append('ApplyLogoColorization', logoSettings.applyColorization.toString()); // Add logo file formData.append('logo', logoUpload.files[0]); @@ -586,8 +586,9 @@ class QRRapidoGenerator { console.log('🎨 Preparando FormData com logo:', { logoFile: logoUpload.files[0].name, logoSize: logoUpload.files[0].size + ' bytes', - logoSizePercent: logoSizeSlider?.value || logoSettings.logoSizePercent || '20', - colorization: logoColorizeToggle?.checked || logoSettings.applyColorization || false, + LogoSizePercent: logoSettings.logoSizePercent, + ApplyLogoColorization: logoSettings.applyColorization, + checkboxChecked: logoColorizeToggle?.checked, endpoint: '/api/QR/GenerateRapidWithLogo' });