es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La codificación JPEG de Windows Media Imaging no respeta el perfil de color de la imagen.

Tengo la siguiente imagen (he puesto una captura de pantalla de la imagen ya que su tamaño es más de 2 MB – la original se puede descargar de https://drive.google.com/file/d/1rC2QQBzMhZ8AG5Lp5PyrpkOxwlyP9QaE/view?usp=sharing

Estoy leyendo la imagen utilizando la clase BitmapDecoder y guardándola utilizando un codificador JPEG. Esto resulta en la siguiente imagen que tiene un color apagado.

La imagen está utilizando el esquema de color PhotoShop RGB. Intenté establecer el perfil de color utilizando el siguiente código, pero esto resulta en el error El codificador BitmapEncoder designado no admite contextos de color

Actualización: Clonar la imagen parece solucionar el problema. Pero cuando redimensiono la imagen utilizando el siguiente código de transformación, el perfil de color no se conserva.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para preservar el perfil de color al utilizar BitmapDecoder y BitmapEncoder

    Si está leyendo una imagen utilizando la clase BitmapDecoder y guardándola utilizando un codificador JPEG, es posible que note que la imagen resultante tiene un color apagado y desvanecido. Esto se debe probablemente a que el perfil de color no se está preservando.

    Para preservar el perfil de color, pruebe el siguiente código:

    var frame = BitmapDecoder.Create(new Uri(inputFilePath, UriKind.RelativeOrAbsolute),BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None).Frames[0];
    
    // Clonar la imagen para conservar el perfil de color
    var copy = BitmapFrame.Create(frame);
    
    // Establecer el codificador para usar el mismo perfil de color que la imagen original
    var encoder = new JpegBitmapEncoder();
    encoder.QualityLevel = 100;
    var colorContext = copy.ColorContexts.FirstOrDefault();
    if (colorContext != null)
    {
        encoder.ColorContexts = new List<colorcontext> { colorContext };
    }
    
    encoder.Frames.Add(copy);
    using (var stream = File.OpenWrite(outputFilePath))
    {
        encoder.Save(stream);
    }
    

    Tenga en cuenta que estamos clonando la imagen utilizando BitmapFrame.Create(frame) para conservar el perfil de color. Luego establecemos el codificador para usar el mismo perfil de color que la imagen original, si está disponible. Y finalmente, agregamos la imagen clonada a los fotogramas del codificador y la guardamos en el archivo de salida.

    Si necesita cambiar el tamaño de la imagen, puede agregar una transformación a la imagen clonada antes de agregarla a los fotogramas del codificador. Sin embargo, tenga en cuenta que cambiar el tamaño puede afectar el perfil de color, por lo que es posible que necesite ajustarlo después. Por ejemplo:

    Transform transform = new ScaleTransform(width / frame.Width * 96 / frame.DpiX, height / frame.Height * 96 / frame.DpiY, 0, 0); 
    var copy = BitmapFrame.Create(frame);
    var resized = BitmapFrame.Create(new TransformedBitmap(copy, transform));          
    
    // Si el perfil de color no se conserva después de cambiar el tamaño, intente establecerlo nuevamente
    var colorContext = copy.ColorContexts.FirstOrDefault();
    if (colorContext != null)
    {
        resized.ColorContexts = new List<colorcontext> { colorContext };
    }
    
    encoder.Frames.Add(resized);
    using (var stream = File.OpenWrite(outputFilePath))
    {
        encoder.Save(stream);
    }
    

    Tenga en cuenta que estamos estableciendo el perfil de color nuevamente después de cambiar el tamaño, en caso de que no se haya conservado. Es posible que necesite experimentar con diferentes opciones para obtener los mejores resultados para su caso de uso específico.

Comments are closed.