public string GetImageUrl(ThumbnailQuality quality, int index = 0)
        {
            if (Date == null)
            {
                throw new Exception("插画日期为空时无法获取插画图片链接");
            }
            //除了原图外所有图片默认后缀统一为jpg
            var ext = "jpg";

            if (quality == ThumbnailQuality.Original)
            {
                if (Suffix == null)
                {
                    throw new Exception("后缀为空时无法获取原图链接");
                }
                ext = Suffix;
            }
            switch (quality)
            {
            case ThumbnailQuality.Original: return($"{ImageBaseUri}/img-original/img/{Date}/{Id}_p{index}.{ext}");

            //original
            default: return($"{ImageBaseUri}/img-original/img/{Date}/{Id}_p{index}.{ext}");
            }
        }
        private Bitmap GetThumbnail(Video videoInfo, ThumbnailQuality quality = ThumbnailQuality.Standard)
        {
            Bitmap result = null;
            string url    = GetThumbnailUrl(videoInfo, quality: quality);

            if (!String.IsNullOrWhiteSpace(url))
            {
                try
                {
                    using (WebClient webClient = new WebClient())
                    {
                        using (Stream stream = webClient.OpenRead(url))
                        {
                            result = new Bitmap(stream);
                            stream.Close();
                            stream.Dispose();
                        }
                        webClient.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    Logger.Log(EventID.DIYoutubeDownloader.Downloader.GetThumbnailException, ex);
                }
            }

            return(result);
        }
        private string GetThumbnailUrl(Video videoInfo, ThumbnailQuality quality = ThumbnailQuality.Standard)
        {
            string url = null;

            if (videoInfo != null)
            {
                switch (quality)
                {
                case ThumbnailQuality.Low:
                    url = videoInfo.Thumbnails.LowResUrl;
                    break;

                case ThumbnailQuality.Standard:
                    url = videoInfo.Thumbnails.StandardResUrl;
                    break;

                case ThumbnailQuality.Medium:
                    url = videoInfo.Thumbnails.MediumResUrl;
                    break;

                case ThumbnailQuality.High:
                    url = videoInfo.Thumbnails.HighResUrl;
                    break;

                case ThumbnailQuality.Max:
                    url = videoInfo.Thumbnails.MaxResUrl;
                    break;

                default:
                    url = videoInfo.Thumbnails.MediumResUrl;
                    break;
                }
            }
            return(url);
        }
        public static string Stringify(this ThumbnailQuality quality)
        {
            switch (quality)
            {
            case ThumbnailQuality.S128: return("128x128");

            case ThumbnailQuality.S240: return("240mw");

            case ThumbnailQuality.S360: return("360x360");

            case ThumbnailQuality.S480: return("480mw");

            case ThumbnailQuality.Mini: return("mini");

            case ThumbnailQuality.Original: return("original");

            case ThumbnailQuality.Regular: return("regular");

            case ThumbnailQuality.Small: return("small");

            case ThumbnailQuality.Thumbnail: return("thumb");

            //Regular
            default: return("regular");
            }
        }
 public static int Value(this ThumbnailQuality thumbnailQuality)
 {
     return(thumbnailQuality switch
     {
         ThumbnailQuality.Low => 70,
         ThumbnailQuality.Medium => 150,
         ThumbnailQuality.High => 300,
         _ => throw new ArgumentOutOfRangeException(nameof(thumbnailQuality), "This state of ThumbnailQuality is not valid.")
     });
 private int TranslateQualitySetting(ThumbnailQuality quality)
 {
     switch (quality)
     {
         case ThumbnailQuality.Normal:
             return 200;
         case ThumbnailQuality.High:
             return 400;
         case ThumbnailQuality.Full:
             return 0;
         default:
             throw new ArgumentException();
     }
 }
 private int TranslateQualitySetting(ThumbnailQuality quality)
 {
     switch (quality)
     {
         case ThumbnailQuality.Normal:
             return 200;
         case ThumbnailQuality.High:
             return 400;
         case ThumbnailQuality.Full:
             return 0;
         default:
             throw new ArgumentException();
     }
 }
        private void UpdateThumbnails(ThumbnailQuality quality)
        {
            var ctx       = SynchronizationContext.Current;
            var canceller = new CancellationTokenSource();

            if (_cancelThumbnailsUpdate != null)
            {
                _cancelThumbnailsUpdate.Cancel();
            }

            _cancelThumbnailsUpdate = canceller;

            Task.Factory.StartNew(() =>
            {
                if (_imageItems.Count == 0)
                {
                    return;
                }

                Parallel.ForEach(Partitioner.Create(0, _imageItems.Count), (range, loopState) =>
                {
                    bool isCancelled = false;
                    for (int i = range.Item1; i < range.Item2; i++)
                    {
                        var currentItem = _imageItems[i];
                        var tb          = _thumbnailer.GetThumbnail(currentItem.FullName, quality);
                        ctx.Post(new SendOrPostCallback((state) => currentItem.Thumbnail = tb), null);
                        if (canceller.IsCancellationRequested)
                        {
                            isCancelled = true;
                            break;
                        }
                    }

                    if (isCancelled)
                    {
                        loopState.Stop();
                    }
                });

                canceller.Dispose();
                if (_cancelThumbnailsUpdate == canceller)
                {
                    _cancelThumbnailsUpdate = null;
                }
            },
                                  CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
        }
        public System.Windows.Media.ImageSource GetThumbnail(string imagePath, ThumbnailQuality quality)
        {
            IShellItem shItem;
            Guid iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
            var hr = SHCreateItemFromParsingName(imagePath, IntPtr.Zero, iIdIShellItem, out shItem);
            if (hr == 0)
            {
                Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
                Guid CLSID_LocalThumbnailCache = new Guid("50EF4544-AC9F-4A8E-B21B-8A26180DB13F");

                var type = Type.GetTypeFromCLSID(CLSID_LocalThumbnailCache);
                var tbCache = (IThumbnailCache)Activator.CreateInstance(type);

                ISharedBitmap bmp = null;
                WTS_CACHEFLAGS cFlags;
                WTS_THUMBNAILID bmpId;

                uint qualitySetting;
                switch (quality)
                {
                    case ThumbnailQuality.Normal:
                        qualitySetting = 96;
                        break;
                    case ThumbnailQuality.High:
                    case ThumbnailQuality.Full:
                        qualitySetting = 128;
                        break;
                    default:
                        qualitySetting = 96;
                        break;

                }

                hr = (int)tbCache.GetThumbnail(shItem, qualitySetting, WTS_FLAGS.WTS_EXTRACT, out bmp, out cFlags, out bmpId);
                if (hr == 0)
                {
                    var bmpPtr = IntPtr.Zero;
                    if (bmp.Detach(out bmpPtr) == 0)
                    {
                        try
                        {

                            var iSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                               bmpPtr, IntPtr.Zero, Int32Rect.Empty,
                               System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

                            DeleteObject(bmpPtr);
                            iSrc.Freeze();
                            return iSrc;

                        }
                        finally
                        {
                            bmpPtr = IntPtr.Zero;
                            Marshal.ReleaseComObject(bmp);
                            Marshal.ReleaseComObject(shItem);
                            bmp = null;
                            shItem = null;
                        }

                    }
                    else
                    {
                        Marshal.ReleaseComObject(bmp);
                        Marshal.ReleaseComObject(shItem);
                        return null;
                    }
                }
                else
                {
                    Marshal.ReleaseComObject(shItem);
                    return null;
                }

            }

            return null;
        }
Exemple #10
0
        public MemoryStream GenerateThumbnailFromFirstPage(string xpsFilePath, XpsImageType imgType, ThumbnailQuality imgQuality = ThumbnailQuality.Medium)
        {
            if (LogHelper.CanDebug())
            {
                LogHelper.Begin("XpsHelper.GenerateThumbnailFromFirstPage");
            }
            try
            {
                BitmapEncoder bitmapEncoder = null;

                XpsDocument           xpsDocument          = new XpsDocument(xpsFilePath, FileAccess.Read);
                FixedDocumentSequence documentPageSequence = xpsDocument.GetFixedDocumentSequence();

                string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(xpsFilePath);
                string fileExtension            = string.Empty;

                switch (imgType)
                {
                case XpsImageType.JpegImageType:
                    bitmapEncoder = new JpegBitmapEncoder();
                    break;

                case XpsImageType.PngImageType:
                    bitmapEncoder = new PngBitmapEncoder();
                    break;
                }

                double imageQualityRatio = 1.0 / (double)imgQuality;

                DocumentPage       documentPage = documentPageSequence.DocumentPaginator.GetPage(0);
                RenderTargetBitmap targetBitmap = new RenderTargetBitmap((int)(documentPage.Size.Width * imageQualityRatio),
                                                                         (int)(documentPage.Size.Height * imageQualityRatio),
                                                                         96.0 * imageQualityRatio,
                                                                         96.0 * imageQualityRatio,
                                                                         PixelFormats.Pbgra32);
                targetBitmap.Render(documentPage.Visual);

                bitmapEncoder.Frames.Add(BitmapFrame.Create(targetBitmap));

                MemoryStream memoryStream = new MemoryStream();
                bitmapEncoder.Save(memoryStream);
                xpsDocument.Close();

                return(memoryStream);
            }
            catch (Exception err)
            {
                LogHelper.Manage("XpsHelper.GenerateThumbnailFromFirstPage", err);
            }
            finally
            {
                LogHelper.End("XpsHelper.GenerateThumbnailFromFirstPage");
            }

            return(null);
        }
 public ImageSource GetThumbnail(string imagePath, ThumbnailQuality quality)
 {
     return GetThumbnailInternal(imagePath, TranslateQualitySetting(quality));
 }
 public Bitmap GetThumbnail(string mediaUrl, ThumbnailQuality quality = ThumbnailQuality.Standard)
 {
     return(this.GetThumbnail(this.GetVideoInfo(mediaUrl), quality: quality));
 }
        public void Assert_GetThumbnail_is_correct(ThumbnailQuality thumbnailQuality, string expected)
        {
            string thumbnailUrl = youtubeVideo.GetThumbnail(thumbnailQuality);

            Assert.AreEqual(thumbnailUrl, expected);
        }
 public ImageSource GetThumbnail(string imagePath, ThumbnailQuality quality)
 {
     return GetThumbnailInternal(imagePath, TranslateQualitySetting(quality));
 }
        public System.Windows.Media.ImageSource GetThumbnail(string imagePath, ThumbnailQuality quality)
        {
            IShellItem shItem;
            Guid       iIdIShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
            var        hr            = SHCreateItemFromParsingName(imagePath, IntPtr.Zero, iIdIShellItem, out shItem);

            if (hr == 0)
            {
                Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
                Guid CLSID_LocalThumbnailCache = new Guid("50EF4544-AC9F-4A8E-B21B-8A26180DB13F");

                var type    = Type.GetTypeFromCLSID(CLSID_LocalThumbnailCache);
                var tbCache = (IThumbnailCache)Activator.CreateInstance(type);

                ISharedBitmap   bmp = null;
                WTS_CACHEFLAGS  cFlags;
                WTS_THUMBNAILID bmpId;

                uint qualitySetting;
                switch (quality)
                {
                case ThumbnailQuality.Normal:
                    qualitySetting = 96;
                    break;

                case ThumbnailQuality.High:
                case ThumbnailQuality.Full:
                    qualitySetting = 128;
                    break;

                default:
                    qualitySetting = 96;
                    break;
                }

                hr = (int)tbCache.GetThumbnail(shItem, qualitySetting, WTS_FLAGS.WTS_EXTRACT, out bmp, out cFlags, out bmpId);
                if (hr == 0)
                {
                    var bmpPtr = IntPtr.Zero;
                    if (bmp.Detach(out bmpPtr) == 0)
                    {
                        try
                        {
                            var iSrc = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                                bmpPtr, IntPtr.Zero, Int32Rect.Empty,
                                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

                            DeleteObject(bmpPtr);
                            iSrc.Freeze();
                            return(iSrc);
                        }
                        finally
                        {
                            bmpPtr = IntPtr.Zero;
                            Marshal.ReleaseComObject(bmp);
                            Marshal.ReleaseComObject(shItem);
                            bmp    = null;
                            shItem = null;
                        }
                    }
                    else
                    {
                        Marshal.ReleaseComObject(bmp);
                        Marshal.ReleaseComObject(shItem);
                        return(null);
                    }
                }
                else
                {
                    Marshal.ReleaseComObject(shItem);
                    return(null);
                }
            }

            return(null);
        }
        private void UpdateThumbnails(ThumbnailQuality quality)
        {
            var ctx = SynchronizationContext.Current;
            var canceller = new CancellationTokenSource();

            if (_cancelThumbnailsUpdate != null)
            {
                _cancelThumbnailsUpdate.Cancel();
            }

            _cancelThumbnailsUpdate = canceller;

            Task.Factory.StartNew(() =>
            {
                if (_imageItems.Count == 0)
                {
                    return;
                }

                Parallel.ForEach(Partitioner.Create(0, _imageItems.Count), (range, loopState) =>
                {
                    bool isCancelled = false;
                    for (int i = range.Item1; i < range.Item2; i++)
                    {
                        var currentItem = _imageItems[i];
                        var tb = _thumbnailer.GetThumbnail(currentItem.FullName, quality);
                        ctx.Post(new SendOrPostCallback((state) => currentItem.Thumbnail = tb), null);
                        if (canceller.IsCancellationRequested)
                        {
                            isCancelled = true;
                            break;
                        }
                    }

                    if (isCancelled)
                    {
                        loopState.Stop();
                    }

                });

                canceller.Dispose();
                if (_cancelThumbnailsUpdate == canceller)
                {
                    _cancelThumbnailsUpdate = null;
                }

            },
            CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);

        }