Example #1
0
        private void GetBackgroundColor(IWICMetadataQueryReader wicMetadataQueryReader)
        {
            // 如果图片里面包含了 global palette 就需要获取 palette 和背景色
            var propertyVariant = new PROPVARIANT();

            wicMetadataQueryReader.GetMetadataByName("/logscrdesc/GlobalColorTableFlag", ref propertyVariant);

            byte backgroundIndex = 0;

            var globalPalette = (propertyVariant.Type & VARTYPE.VT_BOOL) == VARTYPE.VT_BOOL &&
                                propertyVariant.Value.UI1 > 0;

            if (globalPalette)
            {
                propertyVariant = new PROPVARIANT();
                wicMetadataQueryReader.GetMetadataByName("/logscrdesc/BackgroundColorIndex", ref propertyVariant);

                if ((propertyVariant.Type & VARTYPE.VT_UI1) == VARTYPE.VT_UI1)
                {
                    backgroundIndex = propertyVariant.Value.UI1;
                }

                var wicPalette = WicImagingFactory.CreatePalette();
                WicBitmapDecoder.CopyPalette(wicPalette);
            }
        }
Example #2
0
        static void CopyGif()
        {
            using (var dec = WicBitmapDecoder.Load(@"source.gif"))
            {
                var reader = dec.GetMetadataQueryReader();
                Dump(reader);
                Console.WriteLine();

                foreach (var frame in dec)
                {
                    Console.WriteLine(frame.Size);

                    reader = frame.GetMetadataReader();
                    Dump(reader);
                    Console.WriteLine();
                }


                using (var encoder = WICImagingFactory.CreateEncoder(dec.ContainerFormat))
                {
                    using (var file = File.OpenWrite("test.gif"))
                    {
                        var mis = new ManagedIStream(file);
                        encoder.Initialize(mis);

                        foreach (var frame in dec)
                        {
                            var newFrame = encoder.CreateNewFrame();
                            newFrame.Initialize();

                            var md = frame.GetMetadataReader().Enumerate();
                            using (var writer = newFrame.GetMetadataQueryWriter())
                            {
                                writer.EncodeMetadata(md);

                                // change delay here
                                writer.SetMetadataByName("/grctlext/Delay", (ushort)5);
                            }

                            if (frame.Palette != null)
                            {
                                newFrame.SetPalette(frame.Palette.ComObject);
                            }

                            newFrame.WriteSource(frame.ComObject);
                            newFrame.Item1.Commit();
                        }
                        encoder.Commit();
                    }
                }
            }
        }
Example #3
0
 private Bitmap LoadBitmap(string path)
 {
     using (WicBitmapDecoder decoder = ImagingFactory.CreateDecoder(ImagePath, Guid.Empty, DesiredAccess.Read, DecodeOptions.MetadataCacheOnDemand))
     {
         using (WicBitmapFrameDecode frame = decoder.GetFrame(0))
         {
             using (WicFormatConverter converter = ImagingFactory.CreateFormatConverter())
             {
                 converter.Convert(frame, WicPixelFormats.PixelFormat32bppPBGRA, BitmapDitherType.None, null, 0, BitmapPaletteType.Custom);
                 return(RenderTarget.CreateBitmap(converter, new BitmapProperties()));
             }
         }
     }
 }
Example #4
0
        static void Dump(string path)
        {
            //using (var bmp = WicBitmapSource.Load(path))
            //{
            //}

            using (var dec = WicBitmapDecoder.Load(path))
            {
                var reader = dec.GetMetadataQueryReader();
                Dump(reader);
                Console.WriteLine();

                foreach (var frame in dec)
                {
                    Console.WriteLine(frame.Size);

                    reader = frame.GetMetadataReader();
                    Dump(reader);
                    Console.WriteLine();
                }
            }
        }