Browse Source

Allow reading legacy exif data from uncompressed text chunks as well.

pull/1877/head
WINDEV2110EVAL\User 5 years ago
parent
commit
bdb69d1027
  1. 49
      src/ImageSharp/Formats/Png/PngDecoderCore.cs

49
src/ImageSharp/Formats/Png/PngDecoderCore.cs

@ -188,7 +188,7 @@ namespace SixLabors.ImageSharp.Formats.Png
this.AssignTransparentMarkers(alpha, pngMetadata); this.AssignTransparentMarkers(alpha, pngMetadata);
break; break;
case PngChunkType.Text: case PngChunkType.Text:
this.ReadTextChunk(pngMetadata, chunk.Data.GetSpan()); this.ReadTextChunk(metadata, pngMetadata, chunk.Data.GetSpan());
break; break;
case PngChunkType.CompressedText: case PngChunkType.CompressedText:
this.ReadCompressedTextChunk(metadata, pngMetadata, chunk.Data.GetSpan()); this.ReadCompressedTextChunk(metadata, pngMetadata, chunk.Data.GetSpan());
@ -298,7 +298,7 @@ namespace SixLabors.ImageSharp.Formats.Png
break; break;
} }
this.ReadTextChunk(pngMetadata, chunk.Data.GetSpan()); this.ReadTextChunk(metadata, pngMetadata, chunk.Data.GetSpan());
break; break;
case PngChunkType.CompressedText: case PngChunkType.CompressedText:
if (this.colorMetadataOnly) if (this.colorMetadataOnly)
@ -970,7 +970,7 @@ namespace SixLabors.ImageSharp.Formats.Png
/// </summary> /// </summary>
/// <param name="metadata">The metadata to decode to.</param> /// <param name="metadata">The metadata to decode to.</param>
/// <param name="data">The <see cref="T:Span"/> containing the data.</param> /// <param name="data">The <see cref="T:Span"/> containing the data.</param>
private void ReadTextChunk(PngMetadata metadata, ReadOnlySpan<byte> data) private void ReadTextChunk(ImageMetadata baseMetadata, PngMetadata metadata, ReadOnlySpan<byte> data)
{ {
if (this.ignoreMetadata) if (this.ignoreMetadata)
{ {
@ -993,7 +993,10 @@ namespace SixLabors.ImageSharp.Formats.Png
string value = PngConstants.Encoding.GetString(data.Slice(zeroIndex + 1)); string value = PngConstants.Encoding.GetString(data.Slice(zeroIndex + 1));
metadata.TextData.Add(new PngTextData(name, value, string.Empty, string.Empty)); if (!this.TryReadSpecialTextData(baseMetadata, name, value))
{
metadata.TextData.Add(new PngTextData(name, value, string.Empty, string.Empty));
}
} }
/// <summary> /// <summary>
@ -1030,19 +1033,35 @@ namespace SixLabors.ImageSharp.Formats.Png
ReadOnlySpan<byte> compressedData = data.Slice(zeroIndex + 2); ReadOnlySpan<byte> compressedData = data.Slice(zeroIndex + 2);
if (this.TryUncompressTextData(compressedData, PngConstants.Encoding, out string uncompressed)) if (this.TryUncompressTextData(compressedData, PngConstants.Encoding, out string uncompressed) &&
!this.TryReadSpecialTextData(baseMetadata, name, uncompressed))
{ {
if (name.Equals("Raw profile type exif", StringComparison.OrdinalIgnoreCase) && metadata.TextData.Add(new PngTextData(name, uncompressed, string.Empty, string.Empty));
this.TryReadLegacyExifTextChunk(baseMetadata, uncompressed)) }
{ }
// Successfully parsed exif data stored as text in this chunk
} /// <summary>
else /// Checks if the given text chunk is actually storing parsable metadata.
{ /// </summary>
// Seems to be regular old text data, or we failed to parse it in any special way /// <param name="baseMetadata"></param>
metadata.TextData.Add(new PngTextData(name, uncompressed, string.Empty, string.Empty)); /// <param name="chunkName"></param>
} /// <param name="chunkText"></param>
/// <returns>True if metadata was successfully parsed from the text chunk. False if the
/// text chunk was not identified as metadata, and should be stored in the metadata
/// object unmodified.</returns>
private bool TryReadSpecialTextData(ImageMetadata baseMetadata, string chunkName, string chunkText)
{
if (chunkName.Equals("Raw profile type exif", StringComparison.OrdinalIgnoreCase) &&
this.TryReadLegacyExifTextChunk(baseMetadata, chunkText))
{
// Successfully parsed legacy exif data from text
return true;
} }
// TODO: "Raw profile type iptc", potentially others?
// No special chunk data identified
return false;
} }
/// <summary> /// <summary>

Loading…
Cancel
Save