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); } }
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(); } } } }
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())); } } } }
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(); } } }