Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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");
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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");
                    }
                }
            });
        }