@@ -103,7 +103,14 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
103103 {
104104 // We avoid dithering by default to preserve the original colors.
105105 int transparencyIndex = GetTransparentIndex ( quantized , frameMetadata ) ;
106- this . quantizer = new PaletteQuantizer ( gifMetadata . GlobalColorTable . Value , new ( ) { Dither = null } , transparencyIndex ) ;
106+ if ( transparencyIndex >= 0 || gifMetadata . GlobalColorTable . Value . Length < 256 )
107+ {
108+ this . quantizer = new PaletteQuantizer ( gifMetadata . GlobalColorTable . Value , new ( ) { Dither = null } , transparencyIndex ) ;
109+ }
110+ else
111+ {
112+ this . quantizer = KnownQuantizers . Octree ;
113+ }
107114 }
108115 else
109116 {
@@ -198,19 +205,17 @@ private static GifMetadata GetGifMetadata<TPixel>(Image<TPixel> image)
198205 private static GifFrameMetadata GetGifFrameMetadata < TPixel > ( ImageFrame < TPixel > frame , int transparencyIndex )
199206 where TPixel : unmanaged, IPixel < TPixel >
200207 {
208+ GifFrameMetadata ? metadata = null ;
201209 if ( frame . Metadata . TryGetGifMetadata ( out GifFrameMetadata ? gif ) )
202210 {
203- return ( GifFrameMetadata ) gif . DeepClone ( ) ;
211+ metadata = ( GifFrameMetadata ) gif . DeepClone ( ) ;
204212 }
205-
206- GifFrameMetadata ? metadata = null ;
207- if ( frame . Metadata . TryGetPngMetadata ( out PngFrameMetadata ? png ) )
213+ else if ( frame . Metadata . TryGetPngMetadata ( out PngFrameMetadata ? png ) )
208214 {
209215 AnimatedImageFrameMetadata ani = png . ToAnimatedImageFrameMetadata ( ) ;
210216 metadata = GifFrameMetadata . FromAnimatedMetadata ( ani ) ;
211217 }
212-
213- if ( frame . Metadata . TryGetWebpFrameMetadata ( out WebpFrameMetadata ? webp ) )
218+ else if ( frame . Metadata . TryGetWebpFrameMetadata ( out WebpFrameMetadata ? webp ) )
214219 {
215220 AnimatedImageFrameMetadata ani = webp . ToAnimatedImageFrameMetadata ( ) ;
216221 metadata = GifFrameMetadata . FromAnimatedMetadata ( ani ) ;
0 commit comments