Example #1
0
        ////private static void WriteGamma(Stream outputStream)
        ////{
        ////    var gammaValue = (int)(parameters.Gamma * 100000f);

        ////    var chunkData = CreateChunk(gammaValue);

        ////    WriteChunk(outputStream, PngChunkTypeGamma, chunkData);
        ////}

        private static void WriteDataChunks(Stream outputStream, WriteableBitmap writeableBitmap)
        {
            using (var chunkedStream = new ChunkedStream(MaximumChunkSize, data => WriteChunk(outputStream, PngChunkTypeData, data)))
            {
                using (var zlibStream = new ZlibStream(chunkedStream, CompressionMode.Compress, true))
                {
                    var pixels = writeableBitmap.Pixels;
                    var width  = writeableBitmap.PixelWidth;
                    var height = writeableBitmap.PixelHeight;
                    var index  = 0;

                    var dataRowLength = width * 4;
                    var dataRow       = new byte[dataRowLength];

                    for (var y = 0; y < height; y++)
                    {
                        zlibStream.WriteByte(0);

                        for (var x = 0; x < width; x++)
                        {
                            var color = pixels[index++];

                            var alpha = (byte)(color >> 24);

                            int alphaInt = alpha;

                            if (alphaInt == 0)
                            {
                                alphaInt = 1;
                            }

                            alphaInt = (255 << 8) / alphaInt;

                            var dataRowOffset = x * 4;

                            dataRow[dataRowOffset]     = (byte)((((color >> 16) & 0xFF) * alphaInt) >> 8);
                            dataRow[dataRowOffset + 1] = (byte)((((color >> 8) & 0xFF) * alphaInt) >> 8);
                            dataRow[dataRowOffset + 2] = (byte)(((color & 0xFF) * alphaInt) >> 8);
                            dataRow[dataRowOffset + 3] = alpha;
                        }

                        zlibStream.Write(dataRow, 0, dataRowLength);
                    }
                }
            }
        }
Example #2
0
        public static byte[] ZibDecompress(byte[] data)
        {
            var ms = new MemoryStream(data);

            using (var msDecompressed = new System.IO.MemoryStream())
            {
                using (var zs = new ZlibStream(msDecompressed, CompressionMode.Decompress, true))
                {
                    int readByte = ms.ReadByte();
                    while (readByte != -1)
                    {
                        zs.WriteByte((byte)readByte);
                        readByte = ms.ReadByte();
                    }
                    zs.Flush();
                }
                return(msDecompressed.ToArray());
            }
        }