Exemple #1
0
        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);
        }
Exemple #2
0
 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);
             }
         }
 }
Exemple #3
0
 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));
            }
        }