@@ -177,39 +177,46 @@ private void WriteJfifApplicationHeader(ImageMetadata meta, Span<byte> buffer)
177177 /// <param name="metadata">The image metadata.</param>
178178 private void WriteComment ( JpegMetadata metadata )
179179 {
180- if ( metadata . Comments is { Count : 0 } )
180+ int maxCommentLength = 65533 ;
181+
182+ if ( metadata . Comments . Count == 0 )
181183 {
182184 return ;
183185 }
184186
185- // Length (comment strings lengths) + (comments markers with payload sizes)
186- int commentsBytes = metadata . Comments . Sum ( x => x . Length ) + ( metadata . Comments . Count * 4 ) ;
187- int commentStart = 0 ;
188- Span < byte > commentBuffer = new byte [ commentsBytes ] ;
189-
190- foreach ( Memory < char > comment in metadata . Comments )
187+ for ( int i = 0 ; i < metadata . Comments . Count ; i ++ )
191188 {
192- int totalComLength = comment . Length + 4 ;
189+ Memory < char > chars = metadata . Comments [ i ] ;
190+
191+ if ( chars . Length > maxCommentLength )
192+ {
193+ Memory < char > splitComment = chars . Slice ( maxCommentLength , chars . Length - maxCommentLength ) ;
194+ metadata . Comments . Insert ( i + 1 , splitComment ) ;
193195
194- Span < byte > commentData = commentBuffer . Slice ( commentStart , totalComLength ) ;
195- Span < byte > markers = commentData . Slice ( 0 , 2 ) ;
196- Span < byte > payloadSize = commentData . Slice ( 2 , 2 ) ;
197- Span < byte > payload = commentData . Slice ( 4 , comment . Length ) ;
196+ // We don't want to keep the extra bytes
197+ chars = chars . Slice ( 0 , maxCommentLength ) ;
198+ }
199+
200+ int commentLength = chars . Length + 4 ;
201+
202+ Span < byte > comment = new byte [ commentLength ] ;
203+ Span < byte > markers = comment . Slice ( 0 , 2 ) ;
204+ Span < byte > payloadSize = comment . Slice ( 2 , 2 ) ;
205+ Span < byte > payload = comment . Slice ( 4 , chars . Length ) ;
198206
199207 // Beginning of comment ff fe
200208 markers [ 0 ] = JpegConstants . Markers . XFF ;
201209 markers [ 1 ] = JpegConstants . Markers . COM ;
202210
203211 // Write payload size
204- BinaryPrimitives . WriteInt16BigEndian ( payloadSize , ( short ) ( commentData . Length - 2 ) ) ;
212+ int comWithoutMarker = commentLength - 2 ;
213+ payloadSize [ 0 ] = ( byte ) ( ( comWithoutMarker >> 8 ) & 0xFF ) ;
214+ payloadSize [ 1 ] = ( byte ) ( comWithoutMarker & 0xFF ) ;
205215
206- Encoding . ASCII . GetBytes ( comment . Span , payload ) ;
216+ Encoding . ASCII . GetBytes ( chars . Span , payload ) ;
207217
208- // Indicate begin of next comment in buffer
209- commentStart += totalComLength ;
218+ this . outputStream . Write ( comment , 0 , comment . Length ) ;
210219 }
211-
212- this . outputStream . Write ( commentBuffer , 0 , commentBuffer . Length ) ;
213220 }
214221
215222 /// <summary>
0 commit comments