public void TestCreateDecoderMultithread() { var factory = GetImagingFactory(); using (Stream sourceStream = File.Open(@"..\..\..\PanasonicRW2.Tests\P1350577.RW2", FileMode.Open, FileAccess.Read, FileShare.Read)) { Guid nul = Guid.Empty; var stream = new StreamComWrapper(sourceStream); IWICBitmapDecoder decoder = factory.CreateDecoderFromStream(stream, nul, WICDecodeOptions.WICDecodeMetadataCacheOnDemand); decoder.Initialize(stream, WICDecodeOptions.WICDecodeMetadataCacheOnLoad); Parallel.For(0, 8, new ParallelOptions { MaxDegreeOfParallelism = 8 }, (i) => { IWICBitmapFrameDecode frame; decoder.GetFrame(0, out frame); uint w, h; frame.GetSize(out w, out h); var buf = new byte[w * h * 3]; frame.CopyPixels(new WICRect { Height = (int)h, Width = (int)w }, w * 3, (uint)buf.Length, buf); }); } Marshal.ReleaseComObject(factory); }
public static IWICFormatConverter CreateWicImage(IWICImagingFactory wic, string fileName) { using (IWICBitmapDecoder decoder = wic.CreateDecoderFromFileName(fileName)) using (IWICStream decodeStream = wic.CreateStream(fileName, FileAccess.Read)) { decoder.Initialize(decodeStream, DecodeOptions.CacheOnDemand); using (IWICBitmapFrameDecode decodeFrame = decoder.GetFrame(0)) { var converter = wic.CreateFormatConverter(); converter.Initialize(decodeFrame, PixelFormat.Format32bppPBGRA, BitmapDitherType.None, null, 0, BitmapPaletteType.Custom); return(converter); } } }
public static void Initialize(this IWICBitmapDecoder bitmapDecoder, Stream stream, WICDecodeOptions cacheOption) { bitmapDecoder.Initialize(stream.AsCOMStream(), cacheOption); }
protected override void RunOverride(MainForm form, object tag) { bool hasFile = false; bool processed = false; IWICImagingFactory factory = (IWICImagingFactory) new WICImagingFactory(); IWICBitmapDecoderInfo info = null; IWICBitmapDecoder decoder = null; try { info = (IWICBitmapDecoderInfo)factory.CreateComponentInfo(Parent.Clsid); foreach (string file in GetDecodableFiles(form, Parent.Clsid)) { decoder.ReleaseComObject(); decoder = info.CreateInstance(); hasFile = true; IWICStream stream = factory.CreateStream(); stream.InitializeFromFilename(file, NativeMethods.GenericAccessRights.GENERIC_READ); try { decoder.Initialize(stream, WICDecodeOptions.WICDecodeMetadataCacheOnDemand); if (ProcessDecoder(form, decoder, new DataEntry[] { new DataEntry(file) }, tag)) { for (uint index = 0; index < decoder.GetFrameCount(); index++) { IWICBitmapFrameDecode frame = decoder.GetFrame(index); try { if (ProcessFrameDecode(form, frame, new DataEntry[] { new DataEntry(file), new DataEntry(index) }, tag)) { processed = true; } } finally { frame.ReleaseComObject(); } } } else { processed = true; } } catch (Exception e) { form.Add(this, e.TargetSite.ToString(Resources._0_Failed), new DataEntry(file), new DataEntry(e)); } finally { stream.ReleaseComObject(); } } } finally { factory.ReleaseComObject(); info.ReleaseComObject(); decoder.ReleaseComObject(); } if (!hasFile) { form.Add(Parent, string.Format(CultureInfo.CurrentUICulture, Resources.NoFilesFor_0, Parent.Text)); } else if (!processed) { form.Add(this, string.Format(CultureInfo.CurrentUICulture, Resources.NoFilesFor_0, Text)); } }