Browse Source

Quality property fix

pull/2120/head
Dmitry Pentin 4 years ago
parent
commit
7ece3dd84a
  1. 20
      src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs
  2. 39
      src/ImageSharp/Formats/Jpeg/JpegMetadata.cs

20
src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs

@ -122,7 +122,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
this.WriteDefineHuffmanTables(this.scanConfig.HuffmanTables); this.WriteDefineHuffmanTables(this.scanConfig.HuffmanTables);
// Write the quantization tables. // Write the quantization tables.
this.InitQuantizationTables(this.scanConfig.QuantizationTables, jpegMetadata); this.WriteDefineQuantizationTables(this.scanConfig.QuantizationTables, jpegMetadata);
// Write the scan header. // Write the scan header.
this.WriteStartOfScan(this.frameConfig.Components.Length, this.frameConfig.Components); this.WriteStartOfScan(this.frameConfig.Components.Length, this.frameConfig.Components);
@ -188,22 +188,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
|| colorType == JpegEncodingColor.Luminance || colorType == JpegEncodingColor.Luminance
|| colorType == JpegEncodingColor.Rgb; || colorType == JpegEncodingColor.Rgb;
/// <summary>
/// Writes data to "Define Quantization Tables" block for QuantIndex.
/// </summary>
/// <param name="dqt">The "Define Quantization Tables" block.</param>
/// <param name="offset">Offset in "Define Quantization Tables" block.</param>
/// <param name="i">The quantization index.</param>
/// <param name="quant">The quantization table to copy data from.</param>
private static void WriteDataToDqt(byte[] dqt, ref int offset, QuantIndex i, ref Block8x8F quant)
{
dqt[offset++] = (byte)i;
for (int j = 0; j < Block8x8F.Size; j++)
{
dqt[offset++] = (byte)quant[ZigZag.ZigZagOrder[j]];
}
}
/// <summary> /// <summary>
/// Write the start of image marker. /// Write the start of image marker.
/// </summary> /// </summary>
@ -707,7 +691,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
/// </remarks> /// </remarks>
/// <param name="configs">Quantization tables configs.</param> /// <param name="configs">Quantization tables configs.</param>
/// <param name="metadata">Jpeg metadata instance.</param> /// <param name="metadata">Jpeg metadata instance.</param>
private void InitQuantizationTables(JpegQuantizationTableConfig[] configs, JpegMetadata metadata) private void WriteDefineQuantizationTables(JpegQuantizationTableConfig[] configs, JpegMetadata metadata)
{ {
int dataLen = configs.Length * (1 + Block8x8.Size); int dataLen = configs.Length * (1 + Block8x8.Size);

39
src/ImageSharp/Formats/Jpeg/JpegMetadata.cs

@ -67,41 +67,34 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
} }
/// <summary> /// <summary>
/// Gets or sets the encoded quality. /// Gets the encoded quality.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Note that jpeg image can have different quality for luminance and chrominance components. /// Note that jpeg image can have different quality for luminance and chrominance components.
/// This property returns maximum value of luma/chroma qualities. /// This property returns maximum value of luma/chroma qualities if both are present.
/// </remarks> /// </remarks>
public int Quality public int Quality
{ {
get get
{ {
// Jpeg always has a luminance table thus it must have a luminance quality derived from it if (this.luminanceQuality.HasValue)
if (!this.luminanceQuality.HasValue)
{ {
return Quantization.DefaultQualityFactor; if (this.chrominanceQuality.HasValue)
} {
return Math.Max(this.luminanceQuality.Value, this.chrominanceQuality.Value);
int lumaQuality = this.luminanceQuality.Value; }
// Jpeg might not have a chrominance table - return luminance quality (grayscale images) return this.luminanceQuality.Value;
if (!this.chrominanceQuality.HasValue)
{
return lumaQuality;
} }
else
{
if (this.chrominanceQuality.HasValue)
{
return this.chrominanceQuality.Value;
}
int chromaQuality = this.chrominanceQuality.Value; return Quantization.DefaultQualityFactor;
}
// Theoretically, luma quality would always be greater or equal to chroma quality
// But we've already encountered images which can have higher quality of chroma components
return Math.Max(lumaQuality, chromaQuality);
}
set
{
this.LuminanceQuality = value;
this.ChrominanceQuality = value;
} }
} }

Loading…
Cancel
Save