Browse Source

This should write transparency

pull/764/head
Devedse 8 years ago
parent
commit
e65fc5481f
  1. 16
      src/ImageSharp/Formats/Png/PngDecoderCore.cs
  2. 56
      src/ImageSharp/Formats/Png/PngEncoderCore.cs
  3. 8
      src/ImageSharp/Formats/Png/PngMetaData.cs

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

@ -656,8 +656,8 @@ namespace SixLabors.ImageSharp.Formats.Png
scanlineSpan, scanlineSpan,
rowSpan, rowSpan,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Luminance16Trans, pngMetaData.Luminance16Trans.GetValueOrDefault(),
pngMetaData.LuminanceTrans); pngMetaData.LuminanceTrans.GetValueOrDefault());
break; break;
@ -690,8 +690,8 @@ namespace SixLabors.ImageSharp.Formats.Png
this.bytesPerPixel, this.bytesPerPixel,
this.bytesPerSample, this.bytesPerSample,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Rgb48Trans, pngMetaData.Rgb48Trans.GetValueOrDefault(),
pngMetaData.Rgb24Trans); pngMetaData.Rgb24Trans.GetValueOrDefault());
break; break;
@ -740,8 +740,8 @@ namespace SixLabors.ImageSharp.Formats.Png
pixelOffset, pixelOffset,
increment, increment,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Luminance16Trans, pngMetaData.Luminance16Trans.GetValueOrDefault(),
pngMetaData.LuminanceTrans); pngMetaData.LuminanceTrans.GetValueOrDefault());
break; break;
@ -779,8 +779,8 @@ namespace SixLabors.ImageSharp.Formats.Png
this.bytesPerPixel, this.bytesPerPixel,
this.bytesPerSample, this.bytesPerSample,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Rgb48Trans, pngMetaData.Rgb48Trans.GetValueOrDefault(),
pngMetaData.Rgb24Trans); pngMetaData.Rgb24Trans.GetValueOrDefault());
break; break;

56
src/ImageSharp/Formats/Png/PngEncoderCore.cs

@ -292,7 +292,7 @@ namespace SixLabors.ImageSharp.Formats.Png
if (pngMetaData.HasTrans) if (pngMetaData.HasTrans)
{ {
//Write transparency header this.WriteTransparencyMarkers(stream, pngMetaData);
} }
this.WritePhysicalChunk(stream, metaData); this.WritePhysicalChunk(stream, metaData);
@ -305,6 +305,50 @@ namespace SixLabors.ImageSharp.Formats.Png
quantized?.Dispose(); quantized?.Dispose();
} }
/// <summary>
/// Writes the transparency markers to the stream
/// </summary>
/// <param name="stream">The <see cref="Stream"/> containing image data.</param>
/// <param name="pngMetaData">The image meta data.</param>
private void WriteTransparencyMarkers(Stream stream, PngMetaData pngMetaData)
{
if (pngMetaData.ColorType == PngColorType.Rgb)
{
if (pngMetaData.Rgb48Trans != null)
{
var r = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.R);
var g = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.R);
var B = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.B);
var alphaArray = r.Concat(g).Concat(B).ToArray();
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
}
else if (pngMetaData.Rgb24Trans != null)
{
var alphaArray = new byte[6];
alphaArray[0] = pngMetaData.Rgb24Trans.Value.R;
alphaArray[2] = pngMetaData.Rgb24Trans.Value.G;
alphaArray[4] = pngMetaData.Rgb24Trans.Value.B;
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
}
}
else if (pngMetaData.ColorType == PngColorType.Grayscale)
{
if (pngMetaData.Luminance16Trans != null)
{
var alphaArray = BitConverter.GetBytes(pngMetaData.Luminance16Trans.Value);
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
}
else if (pngMetaData.LuminanceTrans != null)
{
var alphaArray = new byte[2];
alphaArray[0] = pngMetaData.LuminanceTrans.Value;
}
}
}
/// <inheritdoc /> /// <inheritdoc />
public void Dispose() public void Dispose()
{ {
@ -848,7 +892,10 @@ namespace SixLabors.ImageSharp.Formats.Png
/// Writes the chunk end to the stream. /// Writes the chunk end to the stream.
/// </summary> /// </summary>
/// <param name="stream">The <see cref="Stream"/> containing image data.</param> /// <param name="stream">The <see cref="Stream"/> containing image data.</param>
private void WriteEndChunk(Stream stream) => this.WriteChunk(stream, PngChunkType.End, null); private void WriteEndChunk(Stream stream)
{
this.WriteChunk(stream, PngChunkType.End, null);
}
/// <summary> /// <summary>
/// Writes a chunk to the stream. /// Writes a chunk to the stream.
@ -856,7 +903,10 @@ namespace SixLabors.ImageSharp.Formats.Png
/// <param name="stream">The <see cref="Stream"/> to write to.</param> /// <param name="stream">The <see cref="Stream"/> to write to.</param>
/// <param name="type">The type of chunk to write.</param> /// <param name="type">The type of chunk to write.</param>
/// <param name="data">The <see cref="T:byte[]"/> containing data.</param> /// <param name="data">The <see cref="T:byte[]"/> containing data.</param>
private void WriteChunk(Stream stream, PngChunkType type, byte[] data) => this.WriteChunk(stream, type, data, 0, data?.Length ?? 0); private void WriteChunk(Stream stream, PngChunkType type, byte[] data)
{
this.WriteChunk(stream, type, data, 0, data?.Length ?? 0);
}
/// <summary> /// <summary>
/// Writes a chunk of a specified length to the stream at the given offset. /// Writes a chunk of a specified length to the stream at the given offset.

8
src/ImageSharp/Formats/Png/PngMetaData.cs

@ -47,22 +47,22 @@ namespace SixLabors.ImageSharp.Formats.Png
/// <summary> /// <summary>
/// Gets or sets the Rgb 24 transparent color. This represents any color in an 8 bit Rgb24 encoded png that should be transparent /// Gets or sets the Rgb 24 transparent color. This represents any color in an 8 bit Rgb24 encoded png that should be transparent
/// </summary> /// </summary>
public Rgb24 Rgb24Trans { get; set; } public Rgb24? Rgb24Trans { get; set; }
/// <summary> /// <summary>
/// Gets or sets the Rgb 48 transparent color. This represents any color in a 16 bit Rgb24 encoded png that should be transparent /// Gets or sets the Rgb 48 transparent color. This represents any color in a 16 bit Rgb24 encoded png that should be transparent
/// </summary> /// </summary>
public Rgb48 Rgb48Trans { get; set; } public Rgb48? Rgb48Trans { get; set; }
/// <summary> /// <summary>
/// Gets or sets the 8 bit grayscale transparent color. This represents any color in an 8 bit grayscale encoded png that should be transparent /// Gets or sets the 8 bit grayscale transparent color. This represents any color in an 8 bit grayscale encoded png that should be transparent
/// </summary> /// </summary>
public byte LuminanceTrans { get; set; } public byte? LuminanceTrans { get; set; }
/// <summary> /// <summary>
/// Gets or sets the 16 bit grayscale transparent color. This represents any color in a 16 bit grayscale encoded png that should be transparent /// Gets or sets the 16 bit grayscale transparent color. This represents any color in a 16 bit grayscale encoded png that should be transparent
/// </summary> /// </summary>
public ushort Luminance16Trans { get; set; } public ushort? Luminance16Trans { get; set; }
/// <summary> /// <summary>
/// Gets or sets a value indicating whether the image has transparency chunk and markers were decoded /// Gets or sets a value indicating whether the image has transparency chunk and markers were decoded

Loading…
Cancel
Save