Beispiel #1
0
        private static void GifBitmapFrameTest()
        {
            var _frame = new GifBitmapFrame(null);

            _frame.DisposalMethod  = GifFrameDisposalMethod.NotDispose;
            _frame.UseTransparency = true;

            // byte _flags = _frame.GetFlags();

            //Console.WriteLine("{0:X2}", _flags);
            Console.ReadLine();
        }
Beispiel #2
0
        public static GifBitmapCoder ConvertStciIndexedToGif(
            StciIndexed aStci, UInt16 aDelay, bool aUseTransparent, int aForeshotingNumber)
        {
            var _stciPalette = aStci.Palette;
            var _colors      = new List <Color>(StciIndexed.NUMBER_OF_COLORS);

            for (int i = 0; i < StciIndexed.NUMBER_OF_COLORS; i++)
            {
                _colors.Add(Color.FromRgb(_stciPalette[i * 3], _stciPalette[i * 3 + 1], _stciPalette[i * 3 + 2]));
            }
            var _palette = new BitmapPalette(_colors);

            var _gifCoder = new GifBitmapCoder(_palette);

            _gifCoder.Extensions.Add(new GifCommentExtension("Egorov A. V. for ja2.su"));

            Int16 _minOffsetX = Int16.MaxValue;
            Int16 _minOffsetY = Int16.MaxValue;

            int foreshotingCount = 0;

            foreach (var _subImage in aStci.Images)
            {
                if (_subImage.AuxData != null && _subImage.AuxData.NumberOfFrames > 0)
                {
                    foreshotingCount++;
                }

                if (aForeshotingNumber > 0 && aForeshotingNumber != foreshotingCount)
                {
                    continue;
                }

                var _header = _subImage.Header;

                _minOffsetX = Math.Min(_minOffsetX, _header.OffsetX);
                _minOffsetY = Math.Min(_minOffsetY, _header.OffsetY);
            }

            if (_minOffsetX < 0 || _minOffsetY < 0)
            {
                var _shiftData = new List <byte>(4);
                _shiftData.AddRange(BitConverter.GetBytes(_minOffsetX));
                _shiftData.AddRange(BitConverter.GetBytes(_minOffsetY));
                var _shiftExtension = new GifApplicationExtension(ApplicationId, _shiftData.ToArray());
                _gifCoder.Extensions.Add(_shiftExtension);
            }

            foreshotingCount = 0;

            foreach (var _subImage in aStci.Images)
            {
                if (_subImage.AuxData != null && _subImage.AuxData.NumberOfFrames > 0)
                {
                    foreshotingCount++;
                }

                if (aForeshotingNumber > 0 && aForeshotingNumber != foreshotingCount)
                {
                    continue;
                }

                var _header = _subImage.Header;

                var _imageSource = BitmapSource.Create(
                    _header.Width,
                    _header.Height,
                    96, 96,
                    PixelFormats.Indexed8,
                    _palette,
                    _subImage.ImageData,
                    _header.Width);

                var _frame   = BitmapFrame.Create(_imageSource);
                var _offsetX = _header.OffsetX;
                var _offsetY = _header.OffsetY;
                if (_minOffsetX < 0 || _minOffsetY < 0)
                {
                    // GIF format suports only positive offsets
                    _offsetX = (short)(_offsetX - _minOffsetX);
                    _offsetY = (short)(_offsetY - _minOffsetY);
                }
                var _bf = new GifBitmapFrame(_frame, (ushort)_offsetX, (ushort)_offsetY);

                if (_subImage.AuxData != null)
                {
                    var _auxData = new byte[AuxObjectData.SIZE];
                    _subImage.AuxData.Save(new MemoryStream(_auxData));
                    _bf.Extensions.Add(new GifApplicationExtension(ApplicationId, _auxData));
                }

                _bf.DisposalMethod   = GifFrameDisposalMethod.RestoreToBackgroundColor;
                _bf.UseGlobalPalette = true;
                _bf.UseTransparency  = aUseTransparent;
                _bf.Delay            = aDelay;
                if (aUseTransparent)
                {
                    _bf.TransparentColorIndex = (byte)aStci.Header.TransparentColorIndex;
                }
                _gifCoder.AddFrame(_bf);
            }

            return(_gifCoder);
        }