@@ -189,6 +189,7 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
189
189
ReadOnlyMemory < TPixel > ? previousPalette = quantized ? . Palette . ToArray ( ) ;
190
190
191
191
// Write following frames.
192
+ uint increment = 0 ;
192
193
for ( int i = 1 ; i < image . Frames . Count ; i ++ )
193
194
{
194
195
currentFrame = image . Frames [ i ] ;
@@ -200,12 +201,14 @@ public void Encode<TPixel>(Image<TPixel> image, Stream stream, CancellationToken
200
201
ClearTransparentPixels ( currentFrame ) ;
201
202
}
202
203
203
- frameControl = this . WriteFrameControlChunk ( stream , currentFrame , ( uint ) i ) ;
204
+ // Each frame control sequence number must be incremented by the
205
+ // number of frame data chunks that follow.
206
+ frameControl = this . WriteFrameControlChunk ( stream , currentFrame , ( uint ) i + increment ) ;
204
207
205
208
// Dispose of previous quantized frame and reassign.
206
209
quantized ? . Dispose ( ) ;
207
210
quantized = this . CreateQuantizedImageAndUpdateBitDepth ( pngMetadata , currentFrame , previousPalette ) ;
208
- this . WriteDataChunks ( frameControl , currentFrame , quantized , stream , true ) ;
211
+ increment += this . WriteDataChunks ( frameControl , currentFrame , quantized , stream , true ) ;
209
212
}
210
213
}
211
214
else
@@ -1013,7 +1016,7 @@ private FrameControl WriteFrameControlChunk(Stream stream, ImageFrame imageFrame
1013
1016
/// <param name="quantized">The quantized pixel data. Can be null.</param>
1014
1017
/// <param name="stream">The stream.</param>
1015
1018
/// <param name="isFrame">Is writing fdAT or IDAT.</param>
1016
- private int WriteDataChunks < TPixel > ( FrameControl frameControl , ImageFrame < TPixel > pixels , IndexedImageFrame < TPixel > ? quantized , Stream stream , bool isFrame )
1019
+ private uint WriteDataChunks < TPixel > ( FrameControl frameControl , ImageFrame < TPixel > pixels , IndexedImageFrame < TPixel > ? quantized , Stream stream , bool isFrame )
1017
1020
where TPixel : unmanaged, IPixel < TPixel >
1018
1021
{
1019
1022
byte [ ] buffer ;
@@ -1070,7 +1073,9 @@ private int WriteDataChunks<TPixel>(FrameControl frameControl, ImageFrame<TPixel
1070
1073
1071
1074
if ( isFrame )
1072
1075
{
1073
- uint sequenceNumber = ( uint ) ( frameControl . SequenceNumber + i ) ;
1076
+ // We increment the sequence number for each frame chunk.
1077
+ // '1' is added to the sequence number to account for the preceding frame control chunk.
1078
+ uint sequenceNumber = ( uint ) ( frameControl . SequenceNumber + 1 + i ) ;
1074
1079
this . WriteFrameDataChunk ( stream , sequenceNumber , buffer , i * maxBlockSize , length ) ;
1075
1080
}
1076
1081
else
@@ -1079,7 +1084,7 @@ private int WriteDataChunks<TPixel>(FrameControl frameControl, ImageFrame<TPixel
1079
1084
}
1080
1085
}
1081
1086
1082
- return numChunks ;
1087
+ return ( uint ) numChunks ;
1083
1088
}
1084
1089
1085
1090
/// <summary>
0 commit comments