From 3c7a39623b87169c69041c14b7b4469d5bab370b Mon Sep 17 00:00:00 2001 From: Socolin Date: Sun, 14 Dec 2025 17:22:12 -0500 Subject: [PATCH] Fix PixelColorType.YCbCr wrongly interpreted as grayscale in PngEncoder --- src/ImageSharp/Formats/Png/PngMetadata.cs | 2 +- .../Formats/Png/PngMetadataTests.cs | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/ImageSharp/Formats/Png/PngMetadata.cs b/src/ImageSharp/Formats/Png/PngMetadata.cs index cecdf88c9d..1cf4bb6ed6 100644 --- a/src/ImageSharp/Formats/Png/PngMetadata.cs +++ b/src/ImageSharp/Formats/Png/PngMetadata.cs @@ -111,7 +111,7 @@ public static PngMetadata FromFormatConnectingMetadata(FormatConnectingMetadata color = PngColorType.Rgb; break; default: - if (colorType.HasFlag(PixelColorType.Luminance)) + if (colorType.HasFlag(PixelColorType.Luminance | PixelColorType.Alpha)) { color = PngColorType.GrayscaleWithAlpha; break; diff --git a/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs index 5cbc27611a..a0c552a221 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngMetadataTests.cs @@ -336,4 +336,29 @@ public void Identify_ReadsLegacyExifData(string imagePath) Assert.Equal(42, (int)exif.GetValue(ExifTag.ImageNumber).Value); } + + + [Theory] + [InlineData(PixelColorType.Binary, PngColorType.Palette)] + [InlineData(PixelColorType.Indexed, PngColorType.Palette)] + [InlineData(PixelColorType.Luminance, PngColorType.Grayscale)] + [InlineData(PixelColorType.RGB, PngColorType.Rgb)] + [InlineData(PixelColorType.BGR, PngColorType.Rgb)] + [InlineData(PixelColorType.YCbCr, PngColorType.RgbWithAlpha)] + [InlineData(PixelColorType.CMYK, PngColorType.RgbWithAlpha)] + [InlineData(PixelColorType.YCCK, PngColorType.RgbWithAlpha)] + public void FromFormatConnectingMetadata_ConvertColorTypeAsExpected(PixelColorType pixelColorType, PngColorType expectedPngColorType) + { + FormatConnectingMetadata formatConnectingMetadata = new() + { + PixelTypeInfo = new PixelTypeInfo(24) + { + ColorType = pixelColorType, + }, + }; + + PngMetadata actual = PngMetadata.FromFormatConnectingMetadata(formatConnectingMetadata); + + Assert.Equal(expectedPngColorType, actual.ColorType); + } }