public static void ReadMP3CoverArt(string source, Guid mediaViewModelId, Delegates.GenerateThumbnailDone setter) { TagLib.File file = TagLib.File.Create(source); if (file.Tag.Pictures.Length >= 1) { byte[] bytes = file.Tag.Pictures[0].Data.Data; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.StreamSource = new MemoryStream(bytes); bitmapImage.EndInit(); setter((BitmapSource)bitmapImage.GetCurrentValueAsFrozen(), mediaViewModelId, null); } }
public static void GenerateThumbnailOfPicture(string source, Guid mediaViewModelId, Delegates.GenerateThumbnailDone setter) { BitmapSource ret; //BitmapMetadata meta = null; //tentative de creation du thumbnail via Bitmap frame : très rapide et très peu couteux en mémoire ! BitmapFrame frame = BitmapFrame.Create(new Uri(source), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None); if (frame.Thumbnail == null) //echec, on tente avec BitmapImage (plus lent et couteux en mémoire) { BitmapImage image = new BitmapImage(); image.DecodePixelHeight = 90; //on limite à 90px de hauteur image.BeginInit(); image.UriSource = new Uri(source); image.CacheOption = BitmapCacheOption.None; image.CreateOptions = BitmapCreateOptions.DelayCreation; //important pour les performances image.EndInit(); if (image.CanFreeze) //pour éviter les memory leak { image.Freeze(); } ret = image; } else { //récupération des métas de l'image //meta = frame.Metadata as BitmapMetadata; ret = frame.Thumbnail; } #region TheBlackReverand : on deactive la gestion de l'orientation dans 1 premier temps // public enum ExifOrientations // { // None = 0, // Normal = 1, // HorizontalFlip = 2, // Rotate180 = 3, // VerticalFlip = 4, // Transpose = 5, // Rotate270 = 6, // Transverse = 7, // Rotate90 = 8 // } //if ((meta != null) && (ret != null)) //si on a des meta, tentative de récupération de l'orientation //{ // if (meta.GetQuery("/app1/ifd/{ushort=274}") != null) // { // orientation = (ExifOrientations)Enum.Parse(typeof(ExifOrientations), meta.GetQuery("/app1/ifd/{ushort=274}").ToString()); // } // double angle = 0; // switch (orientation) // { // case ExifOrientations.Rotate90: // angle = -90; // break; // case ExifOrientations.Rotate180: // angle = 180; // break; // case ExifOrientations.Rotate270: // angle = 90; // break; // } // if (angle != 0) //on doit effectuer une rotation de l'image // { // ret = new TransformedBitmap(ret.Clone(), new RotateTransform(angle)); // ret.Freeze(); // } //} #endregion if (ret != null) { setter((BitmapSource)ret.GetCurrentValueAsFrozen(), mediaViewModelId, null); } }
public static void CaptureScreen(Uri source, Guid mediaViewModelId, Dictionary <TimeSpan, object> captureList, double scale, Delegates.GenerateThumbnailDone finalWorkerPrimary, Delegates.GenerateThumbnailDone finalWorkerThumbnail) { Mutex mutexLock = new Mutex(false, source.GetHashCode().ToString()); mutexLock.WaitOne(); MediaPlayer player = new MediaPlayer { IsMuted = true, ScrubbingEnabled = true }; player.Open(source); player.Pause(); foreach (var pair in captureList) { TimeSpan timeSpan = pair.Key; object timeSpanId = pair.Value; player.Position = timeSpan; int width = 0, height = 0, cpt = 0; // Afin de compenser les temps d'acces on accord 10 essai avec 1s entre chaque essai while (width == 0 || height == 0 && cpt < 10) { Thread.Sleep(1000); width = player.NaturalVideoWidth; height = player.NaturalVideoHeight; cpt++; } RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32); DrawingVisual dv = new DrawingVisual(); using (DrawingContext dc = dv.RenderOpen()) { dc.DrawVideo(player, new Rect(0, 0, width, height)); } rtb.Render(dv); var frame = BitmapFrame.Create(rtb).GetCurrentValueAsFrozen(); if (finalWorkerPrimary != null) { finalWorkerPrimary(frame as BitmapFrame, mediaViewModelId, timeSpanId); } if (scale > 0 && finalWorkerThumbnail != null && frame is BitmapSource) { var thumbnailFrame = BitmapFrame.Create(new TransformedBitmap(frame as BitmapSource, new ScaleTransform(scale, scale))).GetCurrentValueAsFrozen(); finalWorkerThumbnail(thumbnailFrame as BitmapFrame, mediaViewModelId, timeSpanId); } } player.Close(); mutexLock.ReleaseMutex(); }
public static void CaptureScreen(string source, Guid mediaViewModelId, TimeSpan timeSpan, object timeSpanId, double scale, Delegates.GenerateThumbnailDone finalWorkerPrimary, Delegates.GenerateThumbnailDone finalWorkerThumbnail) { CaptureScreen(new Uri(source), mediaViewModelId, new Dictionary <TimeSpan, object> { { timeSpan, timeSpanId } }, scale, finalWorkerPrimary, finalWorkerThumbnail); }
public static void CaptureScreen(Uri source, Guid mediaViewModelId, Dictionary <TimeSpan, object> captureList, Delegates.GenerateThumbnailDone finalWorkerPrimary) { CaptureScreen(source, mediaViewModelId, captureList, -1, finalWorkerPrimary, null); }
public static void CaptureScreen(Uri source, Guid mediaViewModelId, TimeSpan timeSpan, object timeSpanId, Delegates.GenerateThumbnailDone finalWorkerPrimary) { CaptureScreen(source, mediaViewModelId, timeSpan, timeSpanId, -1, finalWorkerPrimary, null); }