Beispiel #1
0
            public BmpWriter(WriteableBitmap bitmap, GifPalette palette)
            {
                _bitmap  = bitmap;
                _palette = palette;

#if !SILVERLIGHT
                _buffer = new byte[(int)_bitmap.Height * (int)_bitmap.Width * 4];
#endif
            }
Beispiel #2
0
        private GifFrame ReadImageData(BinaryReader reader)
        {
            var imageDescriptor = ImageDescriptor.Read(reader);
            var localPalette    = imageDescriptor.HasLocalPalette ? GifPalette.Read(reader, imageDescriptor.LocalPaletteColorCount) : null;

            var lzwInitialCodeSize = reader.ReadByte() + 1;

            var lzwBitReader = new GifLzwBitReader(new GifLzwByteReader(reader));

            var lzwCodeSize  = lzwInitialCodeSize;
            var nextIncValue = (2 << (lzwCodeSize - 1)) - 1;
            var decodeTable  = new GifDecodeTable(_sreenDescriptor.GlobalPaletteColorCount);

            int value;

#if SILVERLIGHT
            var writeableBmp = new WriteableBitmap(_sreenDescriptor.Width, _sreenDescriptor.Height);
#else
            var writeableBmp = new WriteableBitmap(_sreenDescriptor.Width, _sreenDescriptor.Height, 96.0, 96.0, PixelFormats.Bgra32, null);
#endif

            var bmpWriter = new BmpWriter(writeableBmp, _globalPalette);

            while (lzwBitReader.Read(lzwCodeSize, out value))
            {
                if (decodeTable.Count == nextIncValue)
                {
                    lzwCodeSize++;
                    nextIncValue = (2 << (lzwCodeSize - 1)) - 1;
                }

                bool reset;
                if (decodeTable.ProcessNextCode(value, bmpWriter, out reset) == false)
                {
                    break;
                }

                if (reset)
                {
                    lzwCodeSize  = lzwInitialCodeSize;
                    nextIncValue = (2 << (lzwCodeSize - 1)) - 1;
                }

                if (lzwCodeSize > 12)
                {
                    lzwCodeSize = 12;
                }
            }

            bmpWriter.Flush();

            return(new GifFrame(imageDescriptor, localPalette, writeableBmp));
        }
Beispiel #3
0
        public GifImageSource(Stream stream)
        {
            try
            {
                _gifStream = new MemoryStream();
                stream.CopyTo(_gifStream);
                _gifStream.Seek(0, SeekOrigin.Begin);

                using (var reader = new BinaryReader(_gifStream))
                {
                    var gifSign = new string(reader.ReadChars(6));

                    var gif89a = string.Equals(gifSign, "gif89a", StringComparison.OrdinalIgnoreCase);
                    var gif87a = string.Equals(gifSign, "gif87a", StringComparison.OrdinalIgnoreCase);

                    if ((gif87a || gif89a) == false)
                    {
                        return;
                    }

                    _sreenDescriptor = LogicalScreenDescriptor.Read(reader);
                    _globalPalette   = _sreenDescriptor.HasGlobalPalette ? GifPalette.Read(reader, _sreenDescriptor.GlobalPaletteColorCount) : null;

                    while (true)
                    {
                        var ch = reader.ReadChar();

                        if (ch == ';' && reader.BaseStream.Position == reader.BaseStream.Length)
                        {
                            break;
                        }

                        switch (ch)
                        {
                        case '!':
                            SkipExtension(reader);
                            break;

                        case ',':
                            _frames.Add(ReadImage(reader));
                            break;
                        }
                    }
                }

                _isValid = true;
            }
            catch (Exception)
            {
                _isValid = false;
            }
        }
Beispiel #4
0
            public static GifPalette Read(BinaryReader reader, int colorsCount)
            {
                var palette = new GifPalette();

                for (var i = 0; i < colorsCount; i++)
                {
                    var r = reader.ReadByte();
                    var g = reader.ReadByte();
                    var b = reader.ReadByte();

                    palette._colors.Add((0xFF << 24) | (r << 16) | (g << 8) | b);
                }

                return(palette);
            }
        private static Dictionary <int, GifPalette> CreatePalettes(GifDataStream metadata)
        {
            var palettes = new Dictionary <int, GifPalette>();

            Color[] globalColorTable = null;
            if (metadata.Header.LogicalScreenDescriptor.HasGlobalColorTable)
            {
                globalColorTable =
                    metadata.GlobalColorTable
                    .Select(gc => Color.FromArgb(0xFF, gc.R, gc.G, gc.B))
                    .ToArray();
            }

            for (int i = 0; i < metadata.Frames.Count; i++)
            {
                var frame      = metadata.Frames[i];
                var colorTable = globalColorTable;
                if (frame.Descriptor.HasLocalColorTable)
                {
                    colorTable =
                        frame.LocalColorTable
                        .Select(gc => Color.FromArgb(0xFF, gc.R, gc.G, gc.B))
                        .ToArray();
                }

                int?transparencyIndex = null;
                var gce = frame.GraphicControl;
                if (gce != null && gce.HasTransparency)
                {
                    transparencyIndex = gce.TransparencyIndex;
                }

                palettes[i] = new GifPalette(transparencyIndex, colorTable);
            }

            return(palettes);
        }
        private static Dictionary<int, GifPalette> CreatePalettes(GifDataStream metadata)
        {
            var palettes = new Dictionary<int, GifPalette>();
            Color[] globalColorTable = null;
            if (metadata.Header.LogicalScreenDescriptor.HasGlobalColorTable)
            {
                globalColorTable =
                    metadata.GlobalColorTable
                        .Select(gc => Color.FromArgb(0xFF, gc.R, gc.G, gc.B))
                        .ToArray();
            }

            for (int i = 0; i < metadata.Frames.Count; i++)
            {
                var frame = metadata.Frames[i];
                var colorTable = globalColorTable;
                if (frame.Descriptor.HasLocalColorTable)
                {
                    colorTable =
                        frame.LocalColorTable
                            .Select(gc => Color.FromArgb(0xFF, gc.R, gc.G, gc.B))
                            .ToArray();
                }

                int? transparencyIndex = null;
                var gce = frame.GraphicControl;
                if (gce != null && gce.HasTransparency)
                {
                    transparencyIndex = gce.TransparencyIndex;
                }

                palettes[i] = new GifPalette(transparencyIndex, colorTable);
            }

            return palettes;
        }
Beispiel #7
0
 public GifFrame(ImageDescriptor imageDescriptor, GifPalette localPalette, WriteableBitmap writeableBmp)
 {
     _imageDescriptor = imageDescriptor;
     _localPalette    = localPalette;
     _writeableBmp    = writeableBmp;
 }