diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs
index 43d7b07b9..c610c2483 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs
@@ -286,7 +286,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
}
}
- if (lastValuableIndex != 63)
+ // if mcu block contains trailing zeros - we must write end of block (EOB) values indicating that current block is over
+ // this can be done for any number of trailing zeros
+ if (lastValuableIndex < Block8x8F.Size - 1)
{
this.EmitHuff(huffmanTable, 0x00);
}
@@ -461,14 +463,17 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
///
/// Returns index of the last non-zero element in given mcu block, returns -1 if all elements are zero
///
- /// Input mcu.
+ /// Return range is [1..63].
+ /// Mcu block.
/// Index of the last non-zero element.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal static int GetLastNonZeroElement(ref Block8x8F block)
+ private static int GetLastNonZeroElement(ref Block8x8F mcu)
{
- int index = 63;
- ref float elemRef = ref Unsafe.As(ref block);
- while (index > -1 && (int)Unsafe.Add(ref elemRef, index) == 0)
+ int index = Block8x8F.Size - 1;
+ ref float elemRef = ref Unsafe.As(ref mcu);
+
+ // Index range is [63..0), first element is a DC value which will be emitted even if entire mcu contains only zeros
+ while (index > 0 && (int)Unsafe.Add(ref elemRef, index) == 0)
{
index--;
}