@@ -380,18 +380,42 @@ private IndexedImageFrame<TPixel> QuantizeAdditionalFrameAndUpdateMetadata<TPixe
380380                // We can use the color data from the decoded metadata here. 
381381                // We avoid dithering by default to preserve the original colors. 
382382                ReadOnlyMemory < Color >  palette  =  metadata . LocalColorTable . Value ; 
383- 
384383                if  ( hasDuplicates  &&  ! metadata . HasTransparency ) 
385384                { 
386-                     // A difference was  captured but the metadata does not have transparency. 
385+                     // Duplicates were  captured but the metadata does not have transparency. 
387386                    metadata . HasTransparency  =  true ; 
388-                     transparencyIndex  =  palette . Length ; 
389-                     metadata . TransparencyIndex  =  ClampIndex ( transparencyIndex ) ; 
390-                 } 
391387
392-                 PaletteQuantizer  quantizer  =  new ( palette ,  new ( )  {  Dither  =  null  } ,  transparencyIndex ) ; 
393-                 using  IQuantizer < TPixel >  frameQuantizer  =  quantizer . CreatePixelSpecificQuantizer < TPixel > ( this . configuration ,  quantizer . Options ) ; 
394-                 quantized  =  frameQuantizer . BuildPaletteAndQuantizeFrame ( encodingFrame ,  bounds ) ; 
388+                     if  ( palette . Length  <  256 ) 
389+                     { 
390+                         // We can use the existing palette and set the transparent index as the length. 
391+                         // decoders will ignore this value. 
392+                         transparencyIndex  =  palette . Length ; 
393+                         metadata . TransparencyIndex  =  ClampIndex ( transparencyIndex ) ; 
394+ 
395+                         PaletteQuantizer  quantizer  =  new ( palette ,  new ( )  {  Dither  =  null  } ,  transparencyIndex ) ; 
396+                         using  IQuantizer < TPixel >  frameQuantizer  =  quantizer . CreatePixelSpecificQuantizer < TPixel > ( this . configuration ,  quantizer . Options ) ; 
397+                         quantized  =  frameQuantizer . BuildPaletteAndQuantizeFrame ( encodingFrame ,  bounds ) ; 
398+                     } 
399+                     else 
400+                     { 
401+                         // We must quantize the frame to generate a local color table. 
402+                         IQuantizer  quantizer  =  this . hasQuantizer  ?  this . quantizer !  :  KnownQuantizers . Octree ; 
403+                         using  IQuantizer < TPixel >  frameQuantizer  =  quantizer . CreatePixelSpecificQuantizer < TPixel > ( this . configuration ,  quantizer . Options ) ; 
404+                         quantized  =  frameQuantizer . BuildPaletteAndQuantizeFrame ( encodingFrame ,  bounds ) ; 
405+ 
406+                         // The transparency index derived by the quantizer will differ from the index 
407+                         // within the metadata. We need to update the metadata to reflect this. 
408+                         int  derivedTransparencyIndex  =  GetTransparentIndex ( quantized ,  null ) ; 
409+                         metadata . TransparencyIndex  =  ClampIndex ( derivedTransparencyIndex ) ; 
410+                     } 
411+                 } 
412+                 else 
413+                 { 
414+                     // Just use the local palette. 
415+                     PaletteQuantizer  quantizer  =  new ( palette ,  new ( )  {  Dither  =  null  } ,  transparencyIndex ) ; 
416+                     using  IQuantizer < TPixel >  frameQuantizer  =  quantizer . CreatePixelSpecificQuantizer < TPixel > ( this . configuration ,  quantizer . Options ) ; 
417+                     quantized  =  frameQuantizer . BuildPaletteAndQuantizeFrame ( encodingFrame ,  bounds ) ; 
418+                 } 
395419            } 
396420            else 
397421            { 
0 commit comments