Skip to content

Commit 88bb74f

Browse files
Fix #1712
1 parent 424d4f9 commit 88bb74f

File tree

2 files changed

+39
-28
lines changed

2 files changed

+39
-28
lines changed

src/ImageSharp/Formats/Jpeg/JpegEncoder.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream)
2929
where TPixel : unmanaged, IPixel<TPixel>
3030
{
3131
var encoder = new JpegEncoderCore(this);
32-
this.InitializeColorType(image);
3332
encoder.Encode(image, stream);
3433
}
3534

@@ -45,31 +44,7 @@ public Task EncodeAsync<TPixel>(Image<TPixel> image, Stream stream, Cancellation
4544
where TPixel : unmanaged, IPixel<TPixel>
4645
{
4746
var encoder = new JpegEncoderCore(this);
48-
this.InitializeColorType(image);
4947
return encoder.EncodeAsync(image, stream, cancellationToken);
5048
}
51-
52-
/// <summary>
53-
/// If ColorType was not set, set it based on the given image.
54-
/// </summary>
55-
private void InitializeColorType<TPixel>(Image<TPixel> image)
56-
where TPixel : unmanaged, IPixel<TPixel>
57-
{
58-
// First inspect the image metadata.
59-
if (this.ColorType == null)
60-
{
61-
JpegMetadata metadata = image.Metadata.GetJpegMetadata();
62-
this.ColorType = metadata.ColorType;
63-
}
64-
65-
// Secondly, inspect the pixel type.
66-
if (this.ColorType == null)
67-
{
68-
bool isGrayscale =
69-
typeof(TPixel) == typeof(L8) || typeof(TPixel) == typeof(L16) ||
70-
typeof(TPixel) == typeof(La16) || typeof(TPixel) == typeof(La32);
71-
this.ColorType = isGrayscale ? JpegColorType.Luminance : JpegColorType.YCbCrRatio420;
72-
}
73-
}
7449
}
7550
}

src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
8686
ImageMetadata metadata = image.Metadata;
8787
JpegMetadata jpegMetadata = metadata.GetJpegMetadata();
8888

89-
// If the color type was not specified by the user, preserve the color type of the input image, if it's a supported color type.
90-
if (!this.colorType.HasValue && IsSupportedColorType(jpegMetadata.ColorType))
89+
// If the color type was not specified by the user, preserve the color type of the input image.
90+
if (!this.colorType.HasValue)
9191
{
92-
this.colorType = jpegMetadata.ColorType;
92+
this.colorType = SetFallbackColorType(image);
9393
}
9494

9595
// Compute number of components based on color type in options.
@@ -156,6 +156,42 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
156156
stream.Flush();
157157
}
158158

159+
/// <summary>
160+
/// If color type was not set, set it based on the given image.
161+
/// Note, if there is no metadata and the image has multiple components this method
162+
/// returns <see langword="null"/> defering the field assignment
163+
/// to <see cref="InitQuantizationTables(int, JpegMetadata, out Block8x8F, out Block8x8F)"/>.
164+
/// </summary>
165+
private static JpegColorType? SetFallbackColorType<TPixel>(Image<TPixel> image)
166+
where TPixel : unmanaged, IPixel<TPixel>
167+
{
168+
// First inspect the image metadata.
169+
JpegColorType? colorType = null;
170+
JpegMetadata metadata = image.Metadata.GetJpegMetadata();
171+
if (IsSupportedColorType(metadata.ColorType))
172+
{
173+
colorType = metadata.ColorType;
174+
}
175+
176+
// Secondly, inspect the pixel type.
177+
// TODO: PixelTypeInfo should contain a component count!
178+
if (colorType is null)
179+
{
180+
bool isGrayscale =
181+
typeof(TPixel) == typeof(L8) || typeof(TPixel) == typeof(L16) ||
182+
typeof(TPixel) == typeof(La16) || typeof(TPixel) == typeof(La32);
183+
184+
// We don't set multi-component color types here since we can set it based upon
185+
// the quality in InitQuantizationTables.
186+
if (isGrayscale)
187+
{
188+
colorType = JpegColorType.Luminance;
189+
}
190+
}
191+
192+
return colorType;
193+
}
194+
159195
/// <summary>
160196
/// Returns true, if the color type is supported by the encoder.
161197
/// </summary>

0 commit comments

Comments
 (0)