/// <summary> /// Save the image to the specified path then dispose the Image object. /// </summary> /// <param name="img">Image to save</param> /// <param name="path">Full path including file name and extension to save the image to</param> /// <param name="quality">Image save quality (0 - 100)</param> public static void SaveAs(this Image img, string path, int quality = 95) { using (var myEncoderParameters = new EncoderParameters(1)) { var myEncoder = Encoder.Quality; using (var myEncoderParameter = new EncoderParameter(myEncoder, (long)quality)) { myEncoderParameters.Param[0] = myEncoderParameter; using (img) { var dotIndex = path.LastIndexOf('.'); var ext = path.Substring(dotIndex, path.Length - dotIndex - 1); var myImageCodecInfo = EncoderInfo.GetEncoderInfo(ext); img.Save(path, myImageCodecInfo, myEncoderParameters); } } } }
public string Encode(EncoderInfo theEncoderInfo) { Log.Info("Start of encoding bitmaps into video stream..."); //Audio-Video maker process using (var aVMaker = new Process()) { aVMaker.StartInfo.FileName = Path.Combine(theEncoderInfo.ExePath, theEncoderInfo.ExeName); aVMaker.StartInfo.RedirectStandardOutput = true; aVMaker.StartInfo.RedirectStandardError = true; aVMaker.EnableRaisingEvents = true; #if DEBUG aVMaker.StartInfo.UseShellExecute = false; aVMaker.StartInfo.CreateNoWindow = false; #else aVMaker.StartInfo.UseShellExecute = false; aVMaker.StartInfo.CreateNoWindow = true; #endif var aOutFile = GetOutputFile(theEncoderInfo.HookId); //avMaker.StartInfo.Arguments = String.Format(@"-i bitmaps\{0} -vcodec huffyuv output.avi", pngLoc); //avMaker.StartInfo.Arguments = String.Format(@"-i bitmaps\{0} -r 20 output.mp4", pngLoc); aVMaker.StartInfo.Arguments = theEncoderInfo.Arguments + "\\" + aOutFile; // String.Format(@"-i {0} -r {2} -c:v libx264 -preset slow -crf 21 {1}", ifile, outFile, Settings.Default.FramesPerSec); // avMaker.StartInfo.Arguments = String.Format(@" -r 20 -i bitmaps\{0} -c:v libx264 -r 20 -pix_fmt yuv420p output.mp4", pngLoc); var aOutput = new StringBuilder(); var aError = new StringBuilder(); using (var aOutputWaitHandle = new AutoResetEvent(false)) { using (var aErrorWaitHandle = new AutoResetEvent(false)) { if (!aVMaker.Start()) { Log.Error("Error in starting the FFMPEG process!"); } aVMaker.OutputDataReceived += (theSender, theArgs) => { if (theArgs.Data == null) { aOutputWaitHandle.Set(); } else { aOutput.AppendLine(theArgs.Data); } }; aVMaker.ErrorDataReceived += (theSender, theArgs) => { if (theArgs.Data == null) { aErrorWaitHandle.Set(); } else { aError.AppendLine(theArgs.Data); } }; aVMaker.BeginOutputReadLine(); aVMaker.BeginErrorReadLine(); // Log FFMPEG output and errors Log.Info(aOutput); Log.Error(aError); if (aVMaker.WaitForExit(int.MaxValue) && aOutputWaitHandle.WaitOne() && aErrorWaitHandle.WaitOne()) { // Process completed. Check process.ExitCode here. Log.Info("FFMPEG Process completed with exit code:" + aVMaker.ExitCode); } else { // Timed out. Log.Info("FFMPEG Process timeout!"); } return(aOutFile); } } } }