feat: Enhance base64 generation logic in ScreenshotManager with conditions and skip reasons

This commit is contained in:
Miguel 2025-09-08 21:43:03 +02:00
parent 3153f38068
commit 4ef265705c
1 changed files with 64 additions and 2 deletions

View File

@ -519,8 +519,8 @@ namespace CtrEditor.Services
result.FileSizeBytes = fileInfo.Length; result.FileSizeBytes = fileInfo.Length;
} }
// Generar base64 si se solicita // Generar base64 solo si se cumplen las condiciones restrictivas
if (returnBase64) if (returnBase64 && ShouldGenerateBase64(result))
{ {
using (var memoryStream = new MemoryStream()) using (var memoryStream = new MemoryStream())
{ {
@ -530,6 +530,11 @@ namespace CtrEditor.Services
result.Base64Data = Convert.ToBase64String(memoryStream.ToArray()); result.Base64Data = Convert.ToBase64String(memoryStream.ToArray());
} }
} }
else if (returnBase64)
{
// Informar por qué no se generó el base64
result.Base64SkipReason = GetBase64SkipReason(result);
}
result.Timestamp = DateTime.Now; result.Timestamp = DateTime.Now;
return result; return result;
@ -543,6 +548,62 @@ namespace CtrEditor.Services
} }
} }
/// <summary>
/// Determina si se debe generar base64 basado en las restricciones de tamaño y cantidad de objetos
/// </summary>
private bool ShouldGenerateBase64(ScreenshotResult result)
{
const int MAX_DIMENSION = 1024;
// Solo permitir base64 para objetos únicos
if (result.CaptureType == ScreenshotType.Objects && (result.CapturedObjects?.Count != 1))
{
return false;
}
// Verificar dimensiones de la imagen
if (result.Bitmap != null)
{
if (result.Bitmap.PixelWidth > MAX_DIMENSION || result.Bitmap.PixelHeight > MAX_DIMENSION)
{
return false;
}
}
// No generar base64 para canvas completo o áreas grandes
if (result.CaptureType == ScreenshotType.FullCanvas)
{
return false;
}
return true;
}
/// <summary>
/// Obtiene la razón por la cual no se generó el base64
/// </summary>
private string GetBase64SkipReason(ScreenshotResult result)
{
const int MAX_DIMENSION = 1024;
if (result.CaptureType == ScreenshotType.FullCanvas)
{
return "Base64 no generado: Canvas completo excede límites de tokens";
}
if (result.CaptureType == ScreenshotType.Objects && (result.CapturedObjects?.Count != 1))
{
return $"Base64 no generado: Solo se permite para objetos únicos (encontrados: {result.CapturedObjects?.Count ?? 0})";
}
if (result.Bitmap != null && (result.Bitmap.PixelWidth > MAX_DIMENSION || result.Bitmap.PixelHeight > MAX_DIMENSION))
{
return $"Base64 no generado: Imagen excede {MAX_DIMENSION}x{MAX_DIMENSION} píxeles (actual: {result.Bitmap.PixelWidth}x{result.Bitmap.PixelHeight})";
}
return "Base64 no generado: Condiciones no cumplidas";
}
#endregion #endregion
} }
@ -563,6 +624,7 @@ namespace CtrEditor.Services
public string Directory { get; set; } public string Directory { get; set; }
public long FileSizeBytes { get; set; } public long FileSizeBytes { get; set; }
public string Base64Data { get; set; } public string Base64Data { get; set; }
public string Base64SkipReason { get; set; }
public DateTime Timestamp { get; set; } public DateTime Timestamp { get; set; }
public bool IncludeBackground { get; set; } public bool IncludeBackground { get; set; }
public List<CapturedObjectInfo> CapturedObjects { get; set; } = new List<CapturedObjectInfo>(); public List<CapturedObjectInfo> CapturedObjects { get; set; } = new List<CapturedObjectInfo>();