public static Guid ComputeOverlay(string sourceFilePath) { FileContainer fileContainer = FileContainer.NewOverlayContainer(sourceFilePath); var processStartInfo = new ProcessStartInfo(); processStartInfo.WorkingDirectory = TempFileManager.GetTempDirectory(); processStartInfo.UseShellExecute = false; processStartInfo.ErrorDialog = false; processStartInfo.CreateNoWindow = true; processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; string oldFilePath = fileContainer.SourceFileItem.FilePath; string outputFilePath = null; try { LogManager.AddOverlayMessage("SourceFileName " + Path.GetFileName(oldFilePath), "Start Crop"); // resize + crop source image outputFilePath = Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".png"); processStartInfo.FileName = Path.Combine(FrontSettings.ImageMagickPath, "convert"); processStartInfo.Arguments = $"{Path.GetFileName(fileContainer.SourceFileItem.FilePath)} -resize \"{_finalWidth}x{_finalHeight}^\" -gravity Center -crop {_finalWidth}x{_finalHeight}+0+0 {Path.GetFileName(outputFilePath)}"; StartProcess(processStartInfo, 5000); fileContainer.SourceFileItem.FilePath = outputFilePath; LogManager.AddOverlayMessage("OutputFileName " + Path.GetFileName(outputFilePath), "End Crop"); IpfsDaemon.Queue(fileContainer.SourceFileItem); } catch (Exception ex) { TempFileManager.SafeDeleteTempFile(outputFilePath); LogManager.AddOverlayMessage(ex.ToString(), "Exception"); return(fileContainer.ProgressToken); } finally { TempFileManager.SafeDeleteTempFile(oldFilePath); } try { LogManager.AddOverlayMessage("SourceFileName " + Path.GetFileName(fileContainer.SourceFileItem.FilePath), "Start Overlay"); // watermark source image outputFilePath = Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".png"); processStartInfo.FileName = Path.Combine(FrontSettings.ImageMagickPath, "composite"); processStartInfo.Arguments = $"-gravity NorthEast {_overlayImagePath} {Path.GetFileName(fileContainer.SourceFileItem.FilePath)} {Path.GetFileName(outputFilePath)}"; StartProcess(processStartInfo, 5000); fileContainer.OverlayFileItem.FilePath = outputFilePath; LogManager.AddOverlayMessage("OutputFileName " + Path.GetFileName(outputFilePath), "End Overlay"); IpfsDaemon.Queue(fileContainer.OverlayFileItem); } catch (Exception ex) { TempFileManager.SafeDeleteTempFile(outputFilePath); LogManager.AddOverlayMessage(ex.ToString(), "Exception"); return(fileContainer.ProgressToken); } return(fileContainer.ProgressToken); }
private static void Start() { for (int i = 0; i < VideoSettings.NbSpriteDaemon; i++) { Task daemon = Task.Run(() => { while (true) { FileItem fileItem = null; try { Thread.Sleep(1000); fileItem = null; if (!queueFileItems.TryDequeue(out fileItem)) { continue; } CurrentPositionInQueue++; // si le client a pas demandé le progress depuis plus de 20s, annuler l'opération if ((DateTime.UtcNow - fileItem.FileContainer.LastTimeProgressRequested).TotalSeconds > FrontSettings.MaxGetProgressCanceled) { fileItem.EncodeErrorMessage = "Canceled"; fileItem.EncodeProgress = null; fileItem.IpfsErrorMessage = "Canceled"; fileItem.IpfsProgress = null; LogManager.AddSpriteMessage("SourceFileName " + Path.GetFileName(fileItem.FileContainer.SourceFileItem.FilePath) + " car dernier getProgress a dépassé 20s", "Annulation"); fileItem.CleanFiles(); } else { // sprite creation video if (SpriteManager.Encode(fileItem)) { IpfsDaemon.Queue(fileItem); } } } catch (Exception ex) { LogManager.AddSpriteMessage(ex.ToString(), "Exception non gérée"); fileItem.EncodeErrorMessage = "Exception non gérée"; fileItem.CleanFiles(); } } }); daemons.Add(daemon); } }
public static Guid ComputeVideo(string sourceFilePath, string videoEncodingFormats, bool?sprite) { VideoSize[] formats = new VideoSize[0]; if (!string.IsNullOrWhiteSpace(videoEncodingFormats)) { formats = videoEncodingFormats .Split(',') .Select(v => { switch (v) { case "360p": return(VideoSize.F360p); case "480p": return(VideoSize.F480p); case "720p": return(VideoSize.F720p); case "1080p": return(VideoSize.F1080p); default: throw new InvalidOperationException("Format non reconnu."); } }) .ToArray(); } FileContainer fileContainer = FileContainer.NewVideoContainer(sourceFilePath, formats); IpfsDaemon.Queue(fileContainer.SourceFileItem); // si sprite demandé if (sprite ?? false) { fileContainer.AddSpriteVideo(); // get images from video SpriteDaemon.Queue(fileContainer.SpriteVideoFileItem, "Waiting sprite creation..."); } // si encoding est demandé foreach (FileItem file in fileContainer.EncodedFileItems) { EncodeDaemon.Queue(file, "Waiting encode..."); } return(fileContainer.ProgressToken); }
public static void ResizeImage(FileContainer fileContainer) { try { string oldFilePath = fileContainer.SourceFileItem.FilePath; using (Image sourceImage = Image.FromFile(oldFilePath)) { //create a bitmap to hold the new image using (var finalBitmap = new Bitmap(_finalWidth, _finalHeight)) { using (Graphics graphics = Graphics.FromImage(finalBitmap)) { Rectangle sourceRectangle; Rectangle destRectangle = new Rectangle(0, 0, _finalWidth, _finalHeight); // video verticale, garder largeur _finalWidth, couper la hauteur if ((double)sourceImage.Width / (double)sourceImage.Height < ((double)_finalWidth / (double)_finalHeight)) { int hauteur = sourceImage.Width * _finalHeight / _finalWidth; int yOffset = (sourceImage.Height - hauteur) / 2; sourceRectangle = new Rectangle(0, yOffset, sourceImage.Width, hauteur); } else // video horizontale, garder hauteur _finalHeight, couper la largeur { int largeur = sourceImage.Height * _finalWidth / _finalHeight; int xOffset = (sourceImage.Width - largeur) / 2; sourceRectangle = new Rectangle(xOffset, 0, largeur, sourceImage.Height); } graphics.DrawImage(sourceImage, destRectangle, sourceRectangle, GraphicsUnit.Pixel); } string outputFilePath = System.IO.Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".jpeg"); finalBitmap.Save(outputFilePath, ImageFormat.Jpeg); fileContainer.SourceFileItem.FilePath = outputFilePath; } } IpfsDaemon.Queue(fileContainer.SourceFileItem); TempFileManager.SafeDeleteTempFile(oldFilePath); } catch (Exception ex) { LogManager.AddOverlayMessage(ex.ToString(), "Exception"); } }
public static Guid ComputeImage(string sourceFilePath, bool?overlay = null) { FileContainer fileContainer = FileContainer.NewImageContainer(sourceFilePath); // si pas d'option overlay, c'est qu'on veut juste ipfs add l'image if (!(overlay ?? false)) { IpfsDaemon.Queue(fileContainer.SourceFileItem); } else { fileContainer.SourceFileItem.IpfsErrorMessage = "ipfs not asked"; string outputPath = TempFileManager.GetNewTempFilePath(); OverlayManager.Overlay(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Overlay.jpg"), fileContainer.SourceFileItem.FilePath, outputPath); fileContainer.SetOverlay(outputPath); IpfsDaemon.Queue(fileContainer.OverlayFileItem); } return(fileContainer.ProgressToken); }
public static Guid ComputeOverlay(string sourceFilePath, int?x = null, int?y = null) { FileContainer fileContainer = FileContainer.NewOverlayContainer(sourceFilePath); ResizeImage(fileContainer); try { using (Image overlayImage = Image.FromFile(_overlayImagePath)) { using (Image sourceImage = Image.FromFile(fileContainer.SourceFileItem.FilePath)) { using (Graphics graphics = Graphics.FromImage(sourceImage)) { // Si position n'est pas fournie, centrer l'image if (x == null || y == null) { x = (sourceImage.Width / 2) - (overlayImage.Width / 2); y = (sourceImage.Height / 2) - (overlayImage.Height / 2); } graphics.DrawImage(overlayImage, x.Value, y.Value); } string outputFilePath = System.IO.Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".jpeg"); sourceImage.Save(outputFilePath, ImageFormat.Jpeg); fileContainer.OverlayFileItem.FilePath = outputFilePath; } } IpfsDaemon.Queue(fileContainer.OverlayFileItem); } catch (Exception ex) { LogManager.AddOverlayMessage(ex.ToString(), "Exception"); } return(fileContainer.ProgressToken); }
private static void Start() { daemon = Task.Run(() => { while (true) { try { Thread.Sleep(1000); FileItem fileItem; if (!queueFileItems.TryDequeue(out fileItem)) { continue; } CurrentPositionInQueue++; // si le client a pas demandé le progress depuis plus de 20s, annuler l'opération if ((DateTime.UtcNow - fileItem.FileContainer.LastTimeProgressRequested).TotalSeconds > FrontSettings.MaxGetProgressCanceled) { fileItem.EncodeErrorMessage = "Canceled"; fileItem.EncodeProgress = null; fileItem.IpfsErrorMessage = "Canceled"; fileItem.IpfsProgress = null; continue; } // encode video if (!EncodeManager.Encode(fileItem)) { continue; } switch (fileItem.TypeFile) { case TypeFile.SpriteVideo: { string[] files = EncodeManager.GetListImageFrom(fileItem.FilePath); // récupération des images string outputPath = Path.ChangeExtension(TempFileManager.GetNewTempFilePath(), ".jpeg"); // nom du fichier sprite bool successSprite = SpriteManager.CombineBitmap(files.Skip(files.Length - VideoSettings.NbSpriteImages).ToArray(), outputPath); // création du sprite TempFileManager.SafeDeleteTempFiles(files); // suppression des images if (successSprite) { fileItem.FilePath = outputPath; // réaffectation chemin sprite LogManager.AddEncodingMessage("FileSize " + fileItem.FileSize, "End Sprite"); IpfsDaemon.Queue(fileItem); } else { TempFileManager.SafeDeleteTempFile(outputPath); } break; } case TypeFile.EncodedVideo: IpfsDaemon.Queue(fileItem); break; default: throw new InvalidOperationException("type non prévu"); } } catch (Exception ex) { LogManager.AddEncodingMessage(ex.ToString(), "Exception non gérée"); } } }); }