public Stream Write(Texture2D texture2D) { textureData = new Color[texture2D.Width * texture2D.Height]; texture2D.GetData<Color>(textureData); var outputStream = new MemoryStream(); // write PNG signature outputStream.Write(HeaderChunk.PngSignature, 0, HeaderChunk.PngSignature.Length); // write header chunk var headerChunk = new HeaderChunk(); headerChunk.Width = (uint)texture2D.Width; headerChunk.Height = (uint)texture2D.Height; headerChunk.BitDepth = 8; headerChunk.ColorType = colorType; headerChunk.CompressionMethod = 0; headerChunk.FilterMethod = 0; headerChunk.InterlaceMethod = 0; var headerChunkBytes = headerChunk.Encode(); outputStream.Write(headerChunkBytes, 0, headerChunkBytes.Length); // write data chunks var encodedPixelData = EncodePixelData(texture2D); var compressedPixelData = new MemoryStream(); try { using (var deflateStream = new ZlibStream(new MemoryStream(encodedPixelData), CompressionMode.Compress)) { deflateStream.CopyTo(compressedPixelData); } } catch (Exception exception) { throw new Exception("An error occurred during DEFLATE compression.", exception); } var dataChunk = new DataChunk(); dataChunk.Data = compressedPixelData.ToArray(); var dataChunkBytes = dataChunk.Encode(); outputStream.Write(dataChunkBytes, 0, dataChunkBytes.Length); // write end chunk var endChunk = new EndChunk(); var endChunkBytes = endChunk.Encode(); outputStream.Write(endChunkBytes, 0, endChunkBytes.Length); return outputStream; }
/// <summary> /// Decompresses the given data stream from its source ZIP or GZIP format. /// </summary> /// <param name="dataBytes"></param> /// <returns></returns> internal static byte[] Inflate(Stream dataStream) { byte[] outputBytes = null; try { using (var deflateStream = new ZlibStream(dataStream, MonoGame.Utilities.CompressionMode.Decompress)) { int length = (int)deflateStream.BufferSize; if (length == 0) return new byte[0]; outputBytes = new byte[length]; deflateStream.Read(outputBytes, 0, length); } } catch { try { dataStream.Seek (0, SeekOrigin.Begin); #if !WINDOWS_PHONE using (var gzipInputStream = new GZipInputStream(dataStream, System.IO.Compression.CompressionMode.Decompress)) #else using (var gzipInputStream = new GZipInputStream(dataStream)) #endif { int length = (int)gzipInputStream.BaseStream.Length; if (length == 0) return new byte[0]; outputBytes = new byte[length]; gzipInputStream.Read(outputBytes, 0, length); } } catch (Exception exc) { CCLog.Log ("Error decompressing image data: " + exc.Message); } } return outputBytes; }
/// <summary> /// Uncompress a ZLIB-compressed byte array into a byte array. /// </summary> /// /// <seealso cref="ZlibStream.CompressBuffer(byte[])"/> /// <seealso cref="ZlibStream.UncompressString(byte[])"/> /// /// <param name="compressed"> /// A buffer containing ZLIB-compressed data. /// </param> /// /// <returns>The data in uncompressed form</returns> public static byte[] UncompressBuffer(byte[] compressed) { using (var input = new MemoryStream(compressed)) { Stream decompressor = new ZlibStream(input, CompressionMode.Decompress); return ZlibBaseStream.UncompressBuffer(compressed, decompressor); } }
/// <summary> /// Compress a byte array into a new byte array using ZLIB. /// </summary> /// /// <remarks> /// Uncompress it with <see cref="ZlibStream.UncompressBuffer(byte[])"/>. /// </remarks> /// /// <seealso cref="ZlibStream.CompressString(string)"/> /// <seealso cref="ZlibStream.UncompressBuffer(byte[])"/> /// /// <param name="b"> /// A buffer to compress. /// </param> /// /// <returns>The data in compressed form</returns> public static byte[] CompressBuffer(byte[] b) { using (var ms = new MemoryStream()) { Stream compressor = new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression); ZlibBaseStream.CompressBuffer(b, compressor); return ms.ToArray(); } }
private void UnpackDataChunks() { var dataByteList = new List<byte>(); foreach (var dataChunk in dataChunks) { if (dataChunk.Type == "IDAT") { dataByteList.AddRange(dataChunk.Data); } } var compressedStream = new MemoryStream(dataByteList.ToArray()); var decompressedStream = new MemoryStream(); try { using (var deflateStream = new ZlibStream(compressedStream, CompressionMode.Decompress)) { deflateStream.CopyTo(decompressedStream); } } catch (Exception exception) { throw new Exception("An error occurred during DEFLATE decompression.", exception); } var decompressedBytes = decompressedStream.ToArray(); var pixelData = DeserializePixelData(decompressedBytes); DecodePixelData(pixelData); }