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);
// Write the quantization tables.
this.InitQuantizationTables(this.scanConfig.QuantizationTables, jpegMetadata);
this.WriteDefineQuantizationTables(this.scanConfig.QuantizationTables, jpegMetadata);
// Write the scan header.
this.WriteStartOfScan(this.frameConfig.Components.Length, this.frameConfig.Components);
@ -188,22 +188,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
|| colorType == JpegEncodingColor.Luminance
|| 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>
/// Write the start of image marker.
/// </summary>
@ -707,7 +691,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
/// </remarks>
/// <param name="configs">Quantization tables configs.</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);

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

@ -67,41 +67,34 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
}
/// <summary>
/// Gets or sets the encoded quality.
/// Gets the encoded quality.
/// </summary>
/// <remarks>
/// 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>
public int Quality
{
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;
}
int lumaQuality = this.luminanceQuality.Value;
if (this.chrominanceQuality.HasValue)
{
return Math.Max(this.luminanceQuality.Value, this.chrominanceQuality.Value);
}
// Jpeg might not have a chrominance table - return luminance quality (grayscale images)
if (!this.chrominanceQuality.HasValue)
{
return lumaQuality;
return this.luminanceQuality.Value;
}
else
{
if (this.chrominanceQuality.HasValue)
{
return this.chrominanceQuality.Value;
}
int chromaQuality = this.chrominanceQuality.Value;
// 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;
return Quantization.DefaultQualityFactor;
}
}
}

Loading…
Cancel
Save