@@ -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