SixLabors / ImageSharp

:camera: A modern, cross-platform, 2D Graphics library for .NET
https://sixlabors.com/products/imagesharp/
Other
7.26k stars 844 forks source link

File conversion from jpg to webp changes colors of the image #2723

Open WimAtIHomer opened 2 months ago

WimAtIHomer commented 2 months ago

Prerequisites

ImageSharp version

3.1.4

Other ImageSharp packages and versions

none

Environment (Operating system, version and so on)

Windows 11

.NET Framework version

6 and 8

Description

In our application we resize and change images from png and jpg to webp for better performance on the website. This works very good most of the times. But for some jpg images there is a distinct color change. It might be related to #1567 but I am not sure, doesn't happen when just resizing the jpg image.

Steps to Reproduce

using var image = await Image.LoadAsync(file.OpenReadStream()); using var outStream = new MemoryStream(); await image.SaveAsync(outStream, new WebpEncoder());

Jpg image: 3_VMware Better Together

webp image looks like this (see webp in zip): VMware Better Together

Images

VMware Better Together.zip

JimBobSquarePants commented 2 months ago

OK.... This is an interesting issue.

The JPEG has a CMYK ICC profile and is encoded using YCCK colors. When we convert to RGB, the colors are decoded as in the WEBP output. Since we don't then reverse the operation (WEBP encodes as BGR (optional A)) the colors are incorrectly encoded. We preserve the color type as JPEG metadata so encoding reverses the decode color transform and produces a much closer result.

The fix would be to have #1567 working and convert to RGB using the profile as a guide. When that will ever happen, I simply do not know. I need help there.