private void mnuCopyCell_Click(object sender, RoutedEventArgs e) { if (this.CurrentCell.Item == DependencyProperty.UnsetValue) { return; } var cellInfo = this.CurrentCell; if (cellInfo != null) { var column = cellInfo.Column as DataGridBoundColumn; if (column != null) { var element = new FrameworkElement() { DataContext = cellInfo.Item }; BindingOperations.SetBinding(element, FrameworkElement.TagProperty, column.Binding); string _ColumnValueSelected = element.Tag.ToString(); if (_ColumnValueSelected != "") { Clipboard.SetDataObject(_ColumnValueSelected, true); } } } }
private async void ImgurExport(object sender, ExecutedRoutedEventArgs e) { if (_snips.Count < 0) { return; } _readyToExport = true; CustomMessageBox.ShowOK("Select a snip to export", "Export", "OK"); while (_selectedSnip is null) { await Task.Delay(25); } var url = await _selectedSnip.ImgurExport(); Cursor = Cursors.Arrow; _selectedSnip = null; var result = CustomMessageBox.ShowYesNo( $"Image exported successfully. URL is {url}", "Success!", "Copy URL", "Don't copy URL" ); if (result == MessageBoxResult.Yes) { Clipboard.SetDataObject(url); } }
private void btnCopy_Click(object sender, RoutedEventArgs e) { if (_edtXPath.SelectionLength > 0) { string text = _edtXPath.SelectedText; Clipboard.SetText(text); } else { DataObject dobj = new DataObject(); dobj.SetText(_edtXPath.Text); try { IHighlighter highlighter = new DocumentHighlighter( _edtXPath.Document, _edtXPath.SyntaxHighlighting.MainRuleSet); string html = HtmlClipboard.CreateHtmlFragment( _edtXPath.Document, highlighter, null, new HtmlOptions()); HtmlClipboard.SetHtml(dobj, html); } catch { //ignore } Clipboard.SetDataObject(dobj); } }
private void SaveToClipboard() { StringBuilder sb = new StringBuilder(); try { if (this.SelectedItem is IDataTableForExcel) { var item = (IDataTableForExcel)this.SelectedItem; Clipboard.SetDataObject(item.GetDataString(), true); } else { DataRow row = ((DataRowView)this.SelectedItem).Row; foreach (DataColumn c in row.Table.Columns) { sb.Append(c.ColumnName + "\t"); } sb.AppendLine(); foreach (DataColumn c in row.Table.Columns) { sb.Append(row[c.ColumnName] + "\t"); } sb.AppendLine(); Clipboard.SetDataObject(sb.ToString(), true); } } catch (Exception) { } }
public void PreviewSnip(Snip toPreview) { if (toPreview is null) { return; } _selectedSnip = toPreview; if (_readyToExport) { Cursor = Cursors.Wait; _readyToExport = false; return; } Clipboard.SetDataObject(toPreview.BitmapImageScreenshot); var previewWindow = new PreviewWindow(toPreview) { Owner = GetWindow(this), WindowClosed = window => _previews.Remove(window) }; _previews.Add(previewWindow); previewWindow.Show(); }
private void Copy_Click(object sender, RoutedEventArgs e) { if (Show.Text != null) { Clipboard.SetDataObject(Show.Text); } }
public static void SetText(string text) { DataObject dataObject = new DataObject(); dataObject.SetText(text); WPFClipboard.SetDataObject(dataObject, false); }
internal void ExportIdsToClipboard(Deck deck) { if (deck == null) { return; } Clipboard.SetDataObject(Helper.DeckToIdString(deck.GetSelectedDeckVersion())); this.ShowMessage("", "copied ids to clipboard").Forget(); Log.Info("Copied " + deck.GetSelectedDeckVersion().GetDeckInfo() + " to clipboard"); }
protected override async Task ExecuteAsync(ClipboardImplementationViewModel parameter) { var dataObject = new DataObject(); DataObjectExtensions.SetLinkedWClipboardId(dataObject, parameter.Model.ClipboardObject.Id); await parameter.Model.Factory.WriteToDataObject(parameter.Model, dataObject); SysClipboard.SetDataObject(dataObject, false); }
/// <summary> /// Method to invoke when the Copy command is executed. /// </summary> private void Copy() { List <ElementModel> clipData = new List <ElementModel>(); clipData.AddRange(SelectedItems.Select(x => x.ElementModel).ToList()); IDataObject dataObject = new DataObject(ClipboardFormatName); dataObject.SetData(clipData); Clipboard.SetDataObject(dataObject, true); }
private void BtnCopyToClipClick(object sender, RoutedEventArgs e) { // Copies the txt path to the clipboard and shows a notification if (string.IsNullOrEmpty(Settings.Directory)) { Clipboard.SetDataObject( Assembly.GetEntryAssembly()?.Location.Replace("Songify Slim.exe", "Songify.txt") ?? throw new InvalidOperationException()); } else { Clipboard.SetDataObject(Settings.Directory + "\\Songify.txt"); } Lbl_Status.Content = @"Path copied to clipboard."; }
/// <summary> /// Copies a string to the clipboard. If it still exists on the clipboard after the amount of time /// specified in <paramref name="timeout"/>, it will be removed again. /// </summary> /// <param name="value">The text to add to the clipboard.</param> /// <param name="timeout">The amount of time, in seconds, the text should remain on the clipboard.</param> private void CopyToClipboard(string value, double timeout) { if (InvokeRequired) { Invoke(new Action <string, double>(CopyToClipboard), value, timeout); return; } // Try to save the current contents of the clipboard and restore them after the password is removed. var previousText = ""; if (Clipboard.ContainsText()) { Log.Send("Saving previous clipboard contents before storing the password"); previousText = Clipboard.GetText(); } //Clipboard.SetText(value); try { Clipboard.SetDataObject(value); } catch (Exception e) { Log.Send($"Password could not be copied to clipboard: {e.GetType().Name}: {e.Message}", LogLevel.Error); ShowErrorWindow($"Failed to copy your password to the clipboard ({e.GetType().Name}: {e.Message})."); } Task.Delay(TimeSpan.FromSeconds(timeout)).ContinueWith(_ => { Invoke((MethodInvoker)(() => { try { // Only reset the clipboard to its previous contents if it still contains the text we copied to it. // If the clipboard did not previously contain any text, it is simply cleared. if (Clipboard.ContainsText() && Clipboard.GetText() == value) { Log.Send("Restoring previous clipboard contents"); Clipboard.SetText(previousText); } } catch (Exception e) { Log.Send($"Failed to restore previous clipboard contents ({previousText.Length} chars): An exception occurred ({e.GetType().Name}: {e.Message})", LogLevel.Error); } })); }); }
private async Task SetContentAsync(DataPackage content) { var data = content?.GetView(); var wpfData = new DataObject(); if (data?.Contains(StandardDataFormats.Text) ?? false) { wpfData.SetText(await data.GetTextAsync()); } if (data?.Contains(StandardDataFormats.Bitmap) ?? false) { var streamRef = await data.GetBitmapAsync(); var runtimeStream = await streamRef.OpenReadAsync(); var stream = runtimeStream.AsStreamForRead(); var image = new BitmapImage(); image.BeginInit(); image.StreamSource = stream; image.EndInit(); wpfData.SetImage(image); } if (data?.Contains(StandardDataFormats.Html) ?? false) { wpfData.SetData(DataFormats.Html, await data.GetHtmlFormatAsync()); } if (data?.Contains(StandardDataFormats.Rtf) ?? false) { wpfData.SetData(DataFormats.Rtf, await data.GetRtfAsync()); } if (data?.Contains(StandardDataFormats.StorageItems) ?? false) { var items = await data?.GetStorageItemsAsync(); var list = new StringCollection(); foreach (var item in items) { list.Add(item.Path); } wpfData.SetFileDropList(list); } Clipboard.SetDataObject(wpfData); }
private void CopyToClipboard(string path) { if (!File.Exists(path)) { return; } Dispatcher.Invoke(() => { var data = new DataObject(); data.SetImage(path.SourceFrom()); data.SetText(path, TextDataFormat.Text); data.SetFileDropList(new StringCollection { path }); Clipboard.SetDataObject(data, true); }); }
private void JoinButton_OnClick(object sender, RoutedEventArgs e) { if (ViewModel.IsJoinMode) { var stringObjects = ViewModel.ClipboardEntrys.Where(x => x.JoinThis).Select(x => x.Value.Trim()).ToList(); var joins = string.Join(ViewModel.JoinSeperator, stringObjects); Clipboard.SetDataObject(joins); } else { foreach (var stringObject in ViewModel.ClipboardEntrys.Where(x => x.JoinThis)) { stringObject.JoinThis = false; } JoinSplitterInput.IsOpen = true; } ViewModel.IsJoinMode = !ViewModel.IsJoinMode; }
private static void CopyToClipboardRecursiveRetry(string obj, int retryCount, int maxRetryCount) { if (obj == null) { return; } obj = obj.Replace('`', '\''); try { Clipboard.Clear(); Thread.Sleep(50); Clipboard.SetDataObject(obj); } catch (COMException ex) { if (retryCount < maxRetryCount) { Thread.Sleep(200); CopyToClipboardRecursiveRetry(obj, retryCount + 1, maxRetryCount); } } }
public void SetClipboardContent(string content) { if (string.IsNullOrEmpty(content)) { return; } if (content.StartsWith(pngImageHeader)) { try { byte[] rawImage = Convert.FromBase64String(content.Remove(0, pngImageHeader.Length)); using (MemoryStream imageStream = new MemoryStream(rawImage, 0, rawImage.Length)) { BitmapImage bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = imageStream; bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.EndInit(); bitmap.Freeze(); WinClipboard.SetImage(bitmap); } } catch (Exception ex) { Logger.Error("Error while trying to set clipboard image content!", ex); return; } } else { try { WinClipboard.SetDataObject(content, true); } catch (ExternalException ex) { Logger.Error("Error while trying to set clipboard text content!", ex); return; } } lastSetContent = content; }
internal async void ExportCardNamesToClipboard(Deck deck) { if (deck == null || !deck.GetSelectedDeckVersion().Cards.Any()) { return; } var english = true; var altLang = Config.Instance.AlternativeLanguages.FirstOrDefault(x => x != Config.Instance.SelectedLanguage); if (altLang != null || Config.Instance.SelectedLanguage != "enUS") { try { english = await this.ShowLanguageSelectionDialog(Config.Instance.SelectedLanguage == "enUS"?altLang : Config.Instance.SelectedLanguage); } catch (Exception ex) { Log.Error(ex); } } try { var names = deck.GetSelectedDeckVersion() .Cards.ToSortedCardList() .Select(c => (english ? c.Name : c.LocalizedName) + (c.Count > 1 ? " x " + c.Count : "")) .Aggregate((c, n) => c + Environment.NewLine + n); Clipboard.SetDataObject(names); this.ShowMessage("", "copied names to clipboard").Forget(); Log.Info("Copied " + deck.GetDeckInfo() + " names to clipboard"); } catch (Exception ex) { Log.Error(ex); this.ShowMessage("", "Error copying card names to clipboard.").Forget(); } }
private async void PutInClipboard(bool insert = true, bool fromListbox = true, string text = "") { if (fromListbox && CLipboardEntryListBox.SelectedIndex == -1) { return; } bool placeholderReplacement = false; if (fromListbox) { text = ViewModel.ClipboardEntrys[CLipboardEntryListBox.SelectedIndex].Value; if (CLipboardEntryListBox.SelectedIndex != 0 && insert && text.Contains(ViewModel.PlaceHolder)) { text = text.Replace(ViewModel.PlaceHolder, ViewModel.ClipboardEntrys[0].Value); placeholderReplacement = true; } } HideWindow(); Clipboard.SetDataObject(text); if (insert) { await Task.Delay(250); SendKeys.SendWait("^v"); } if (placeholderReplacement && ViewModel.ClipboardEntrys[0].Value == text) { ViewModel.ClipboardEntrys.RemoveAt(0); } }
/// <summary> /// Method to invoke when the Cut command is executed. /// </summary> private void Cut() { List <ElementModel> clipData = new List <ElementModel>(); clipData.AddRange(SelectedItems.Select(x => x.ElementModel).ToList()); IDataObject dataObject = new DataObject(ClipboardFormatName); dataObject.SetData(clipData); Clipboard.SetDataObject(dataObject, true); var itemsToCut = SelectedItems.ToList(); DeselectAll(); foreach (var elementModelViewModel in itemsToCut) { var parentToLeave = elementModelViewModel.ParentViewModel as ElementModelViewModel; if (parentToLeave != null) { PropModelServices.Instance().RemoveFromParent(elementModelViewModel.ElementModel, parentToLeave.ElementModel); } } OnModelsChanged(); }
public override void OnApplyTemplate() { base.OnApplyTemplate(); var cancelButton = Template.FindName("CancelButton", this) as ImageButton; var fileButton = Template.FindName("FileButton", this) as ImageButton; var folderButton = Template.FindName("FolderButton", this) as ImageButton; var detailsButton = Template.FindName("DetailsButton", this) as ImageButton; var copyMenu = Template.FindName("CopyMenuItem", this) as ImageMenuItem; var copyImageMenu = Template.FindName("CopyImageMenuItem", this) as ImageMenuItem; var copyFilenameMenu = Template.FindName("CopyFilenameMenuItem", this) as ImageMenuItem; var copyFolderMenu = Template.FindName("CopyFolderMenuItem", this) as ImageMenuItem; if (cancelButton != null) cancelButton.Click += (s, a) => RaiseCancelClickedEvent(); //Open file. if (fileButton != null) fileButton.Click += (s, a) => { RaiseOpenFileClickedEvent(); try { if (!string.IsNullOrWhiteSpace(OutputFilename) && File.Exists(OutputFilename)) Process.Start(OutputFilename); } catch (Exception ex) { Dialog.Ok("Open File", "Error while openning the file", ex.Message); } }; //Open folder. if (folderButton != null) folderButton.Click += (s, a) => { RaiseExploreFolderClickedEvent(); try { if (!string.IsNullOrWhiteSpace(OutputFilename) && Directory.Exists(OutputPath)) Process.Start("explorer.exe", $"/select,\"{OutputFilename}\""); } catch (Exception ex) { Dialog.Ok("Explore Folder", "Error while openning the folder", ex.Message); } }; //Details. Usually when something wrong happens. if (detailsButton != null) detailsButton.Click += (s, a) => { if (Exception != null) { var viewer = new ExceptionViewer(Exception); viewer.ShowDialog(); } }; //Copy (as image and text). if (copyMenu != null) copyMenu.Click += (s, a) => { if (!string.IsNullOrWhiteSpace(OutputFilename)) { var data = new DataObject(); data.SetImage(OutputFilename.SourceFrom()); data.SetText(OutputFilename, TextDataFormat.Text); data.SetFileDropList(new StringCollection { OutputFilename }); Clipboard.SetDataObject(data, true); } }; //Copy as image. if (copyImageMenu != null) copyImageMenu.Click += (s, a) => { if (!string.IsNullOrWhiteSpace(OutputFilename)) Clipboard.SetImage(OutputFilename.SourceFrom()); }; //Copy full path. if (copyFilenameMenu != null) copyFilenameMenu.Click += (s, a) => { if (!string.IsNullOrWhiteSpace(OutputFilename)) Clipboard.SetText(OutputFilename); }; //Copy folder path. if (copyFolderMenu != null) copyFolderMenu.Click += (s, a) => { if (!string.IsNullOrWhiteSpace(OutputPath)) Clipboard.SetText(OutputPath); }; }
private void Encode(List <FrameInfo> listFrames, int id, Parameters param, CancellationTokenSource tokenSource) { var processing = FindResource("Encoder.Processing").ToString(); try { switch (param.Type) { case Export.Gif: #region Gif #region Cut/Paint Unchanged Pixels if (param.EncoderType == GifEncoderType.Legacy || param.EncoderType == GifEncoderType.ScreenToGif) { if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } } #endregion switch (param.EncoderType) { case GifEncoderType.ScreenToGif: #region Improved encoding using (var stream = new MemoryStream()) { using (var encoder = new GifFile(stream, param.RepeatCount)) { encoder.UseGlobalColorTable = param.UseGlobalColorTable; encoder.TransparentColor = param.DummyColor; encoder.MaximumNumberColor = param.MaximumNumberColors; for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Improved Encoding"); } } #endregion break; case GifEncoderType.Legacy: #region Legacy Encoding using (var encoder = new AnimatedGifEncoder()) { if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); encoder.SetTransparent(color); encoder.SetDispose(1); //Undraw Method, "Leave". } encoder.Start(param.Filename); encoder.SetQuality(param.Quality); encoder.SetRepeat(param.RepeatCount); var numImage = 0; foreach (var frame in listFrames) { #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion if (!frame.HasArea && param.DetectUnchangedPixels) { continue; } var bitmapAux = new Bitmap(frame.Path); encoder.SetDelay(frame.Delay); encoder.AddFrame(bitmapAux, frame.Rect.X, frame.Rect.Y); bitmapAux.Dispose(); Update(id, numImage, string.Format(processing, numImage)); numImage++; } } #endregion break; case GifEncoderType.PaintNet: #region paint.NET encoding using (var stream = new MemoryStream()) { using (var encoder = new GifEncoder(stream, null, null, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { var bitmapAux = new Bitmap(listFrames[i].Path); encoder.AddFrame(bitmapAux, 0, 0, TimeSpan.FromMilliseconds(listFrames[i].Delay)); bitmapAux.Dispose(); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } stream.Position = 0; try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, Constants.BufferSize, false)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Encoding with paint.Net."); } } #endregion break; default: throw new Exception("Undefined Gif encoder type"); } #endregion break; case Export.Apng: #region Apng #region Cut/Paint Unchanged Pixels if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.A, param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } #endregion #region Encoding using (var stream = new MemoryStream()) { var frameCount = listFrames.Count(x => x.HasArea); using (var encoder = new Apng(stream, frameCount, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Apng Encoding"); } } #endregion #endregion break; case Export.Video: #region Video switch (param.VideoEncoder) { case VideoEncoderType.AviStandalone: #region Avi Standalone var image = listFrames[0].Path.SourceFrom(); if (File.Exists(param.Filename)) { File.Delete(param.Filename); } //1000 / listFrames[0].Delay using (var aviWriter = new AviWriter(param.Filename, param.Framerate, image.PixelWidth, image.PixelHeight, param.VideoQuality)) { var numImage = 0; foreach (var frame in listFrames) { using (var outStream = new MemoryStream()) { var bitImage = frame.Path.SourceFrom(); var enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitImage)); enc.Save(outStream); outStream.Flush(); using (var bitmap = new Bitmap(outStream)) aviWriter.AddFrame(bitmap, param.FlipVideo); } Update(id, numImage, string.Format(processing, numImage)); numImage++; #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } #endregion break; case VideoEncoderType.Ffmpg: #region Video using FFmpeg SetStatus(Status.Encoding, id, null, true); if (!Util.Other.IsFfmpegPresent()) { throw new ApplicationException("FFmpeg not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } #region Generate concat var concat = new StringBuilder(); foreach (var frame in listFrames) { concat.AppendLine("file '" + frame.Path + "'"); concat.AppendLine("duration " + (frame.Delay / 1000d).ToString(CultureInfo.InvariantCulture)); } var concatPath = Path.GetDirectoryName(listFrames[0].Path) ?? Path.GetTempPath(); var concatFile = Path.Combine(concatPath, "concat.txt"); if (!Directory.Exists(concatPath)) { Directory.CreateDirectory(concatPath); } if (File.Exists(concatFile)) { File.Delete(concatFile); } File.WriteAllText(concatFile, concat.ToString()); #endregion param.Command = string.Format(param.Command, concatFile, param.ExtraParameters.Replace("{H}", param.Height.ToString()).Replace("{W}", param.Width.ToString()), param.Filename); var process = new ProcessStartInfo(UserSettings.All.FfmpegLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro = Process.Start(process); var str = pro.StandardError.ReadToEnd(); var fileInfo = new FileInfo(param.Filename); if (!fileInfo.Exists || fileInfo.Length == 0) { throw new Exception("Error while encoding with FFmpeg.") { HelpLink = str } } ; #endregion break; default: throw new Exception("Undefined video encoder"); } #endregion break; default: throw new ArgumentOutOfRangeException(nameof(param)); } if (!tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Completed, id, param.Filename); } #region Upload if (param.Upload && File.Exists(param.Filename)) { /* * using (var w = new WebClient()) * { * var clientID = "15 digit key"; * w.Headers.Add("Authorization", "Client-ID " + clientID); * var values = new NameValueCollection { { "image", Convert.ToBase64String(File.ReadAllBytes(@""+filename)) }}; * var response = w.UploadValues("https://api.imgur.com/3/upload.xml", values); * var x = XDocument.Load(new MemoryStream(response)); * var link = x.Descendants().Where(n => n.Name == "link").FirstOrDefault(); * string href = link.Value; * } */ } #endregion #region Copy to clipboard if (param.CopyToClipboard && File.Exists(param.Filename)) { Dispatcher.Invoke(() => { try { var data = new DataObject(); switch (param.CopyType) { case CopyType.File: if (param.Type != Export.Video) { data.SetImage(param.Filename.SourceFrom()); } data.SetText(param.Filename, TextDataFormat.Text); data.SetFileDropList(new StringCollection { param.Filename }); break; case CopyType.FolderPath: data.SetText(Path.GetDirectoryName(param.Filename) ?? param.Filename, TextDataFormat.Text); break; case CopyType.Link: data.SetText(param.Filename, TextDataFormat.Text); //TODO: Link. break; default: data.SetText(param.Filename, TextDataFormat.Text); break; } Clipboard.SetDataObject(data, true); InternalSetCopy(id, true); } catch (Exception e) { LogWriter.Log(e, "It was not possible to copy the file."); InternalSetCopy(id, false, e); } }); } #endregion #region Execute commands if (param.ExecuteCommands && !string.IsNullOrWhiteSpace(param.PostCommands)) { var command = param.PostCommands.Replace("{p}", "\"" + param.Filename + "\"").Replace("{f}", "\"" + Path.GetDirectoryName(param.Filename) + "\""); var output = ""; try { foreach (var com in command.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)) { var procStartInfo = new ProcessStartInfo("cmd", "/c " + com) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (var process = new Process()) { process.StartInfo = procStartInfo; process.Start(); var message = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(error)) { throw new Exception(error); } process.WaitForExit(1000); } } InternalSetCommand(id, true, output); } catch (Exception e) { LogWriter.Log(e, "It was not possible to run the post encoding command."); InternalSetCommand(id, false, output, e); } } #endregion } catch (Exception ex) { LogWriter.Log(ex, "Encode"); SetStatus(Status.Error, id, null, false, ex); } finally { #region Delete Encoder Folder try { var encoderFolder = Path.GetDirectoryName(listFrames[0].Path); if (!string.IsNullOrEmpty(encoderFolder)) { if (Directory.Exists(encoderFolder)) { Directory.Delete(encoderFolder, true); } } } catch (Exception ex) { LogWriter.Log(ex, "Cleaning the Encode folder"); } #endregion GC.Collect(); } }
private void btn_copy_Click(object sender, RoutedEventArgs e) { Clipboard.SetDataObject(txt_result.Text); }
private void CopySnip(object sender, ExecutedRoutedEventArgs e) { Clipboard.SetDataObject(_toPreview.BitmapImageScreenshot); }
private void RadGridView_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { //选项中没有勾选“双击复制”return lvf 2018年10月8日09:18:28 if (Wlst.Cr.CoreOne.Services.OptionXmlSvr.GetOptionBool(3102, 4, false) == false) { return; } try { var listView = sender as Telerik.Windows.Controls.RadGridView; if (listView == null) { return; } var ggg = listView.CurrentCellInfo; if (ggg == null) { return; } var mvvm = ggg.Item as EquipmentFaultViewModel; if (mvvm == null) { return; } //var cellIndex = ggg.Column.DisplayIndex; //if (cellIndex < 0) return; //int index = cellIndex + 1; //var strdata = string.Empty; //if (index == 1) strdata = mvvm.Index + ""; //if (index == 2) strdata = mvvm.PhyId + ""; //if (index == 3) strdata = mvvm.RtuName + ""; //if (index == 4) strdata = mvvm.CQJ + ""; //if (index == 5) strdata = mvvm.DYGH + ""; //if (index == 6) strdata = mvvm.RtuLoopName + ""; //if (index == 7) strdata = mvvm.FaultName + ""; //if (index == 8) strdata = mvvm.DtCreateTime + ""; //if (index == 9) strdata = mvvm.DtRemoceTime + ""; //if (index == 10) strdata = mvvm.Remark + ""; var sps = mvvm.Index + "\t"; sps += mvvm.PhyId + "\t"; sps += mvvm.RtuName + "\t"; if (fxg.IsVisible) { sps += mvvm.CQJ + "\t"; } if (fxg.IsVisible) { sps += mvvm.DYGH + "\t"; } sps += mvvm.RtuLoopName + "\t"; sps += mvvm.FaultName + "\t"; sps += mvvm.DtCreateTime + "\t"; if (rbold.IsChecked == true) { sps += mvvm.DtRemoceTime; } sps += mvvm.Remark; Clipboard.SetDataObject(sps); } catch (Exception ex) { } }
private async void Encode(List <FrameInfo> listFrames, int id, Parameters param, CancellationTokenSource tokenSource) { var processing = this.DispatcherStringResource("Encoder.Processing"); try { switch (param.Type) { case Export.Gif: #region Gif #region Cut/Paint Unchanged Pixels if (param.EncoderType == GifEncoderType.Legacy || param.EncoderType == GifEncoderType.ScreenToGif) { if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } } #endregion switch (param.EncoderType) { case GifEncoderType.ScreenToGif: #region Improved encoding using (var stream = new MemoryStream()) { using (var encoder = new GifFile(stream, param.RepeatCount)) { encoder.UseGlobalColorTable = param.UseGlobalColorTable; encoder.TransparentColor = param.DummyColor; encoder.MaximumNumberColor = param.MaximumNumberColors; for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Improved Encoding"); } } #endregion break; case GifEncoderType.Legacy: #region Legacy Encoding using (var encoder = new AnimatedGifEncoder()) { if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); encoder.SetTransparent(color); encoder.SetDispose(1); //Undraw Method, "Leave". } encoder.Start(param.Filename); encoder.SetQuality(param.Quality); encoder.SetRepeat(param.RepeatCount); var numImage = 0; foreach (var frame in listFrames) { #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion if (!frame.HasArea && param.DetectUnchangedPixels) { continue; } var bitmapAux = new Bitmap(frame.Path); encoder.SetDelay(frame.Delay); encoder.AddFrame(bitmapAux, frame.Rect.X, frame.Rect.Y); bitmapAux.Dispose(); Update(id, numImage, string.Format(processing, numImage)); numImage++; } } #endregion break; case GifEncoderType.PaintNet: #region paint.NET encoding using (var stream = new MemoryStream()) { using (var encoder = new GifEncoder(stream, null, null, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { var bitmapAux = new Bitmap(listFrames[i].Path); encoder.AddFrame(bitmapAux, 0, 0, TimeSpan.FromMilliseconds(listFrames[i].Delay)); bitmapAux.Dispose(); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } stream.Position = 0; try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, Constants.BufferSize, false)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Encoding with paint.Net."); } } #endregion break; case GifEncoderType.FFmpeg: #region FFmpeg encoding SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsFfmpegPresent()) { throw new ApplicationException("FFmpeg not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } #region Generate concat var concat = new StringBuilder(); foreach (var frame in listFrames) { concat.AppendLine("file '" + frame.Path + "'"); concat.AppendLine("duration " + (frame.Delay / 1000d).ToString(CultureInfo.InvariantCulture)); } var concatPath = Path.GetDirectoryName(listFrames[0].Path) ?? Path.GetTempPath(); var concatFile = Path.Combine(concatPath, "concat.txt"); if (!Directory.Exists(concatPath)) { Directory.CreateDirectory(concatPath); } if (File.Exists(concatFile)) { File.Delete(concatFile); } File.WriteAllText(concatFile, concat.ToString()); #endregion param.Command = string.Format(param.Command, concatFile, param.ExtraParameters.Replace("{H}", param.Height.ToString()).Replace("{W}", param.Width.ToString()), param.Filename); var process = new ProcessStartInfo(UserSettings.All.FfmpegLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro = Process.Start(process); var str = pro.StandardError.ReadToEnd(); var fileInfo = new FileInfo(param.Filename); if (!fileInfo.Exists || fileInfo.Length == 0) { throw new Exception("Error while encoding the gif with FFmpeg.") { HelpLink = $"Command:\n\r{param.Command}\n\rResult:\n\r{str}" } } ; #endregion break; case GifEncoderType.Gifski: #region Gifski encoding SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsGifskiPresent()) { throw new ApplicationException("Gifski not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } var gifski = new GifskiInterop(); var handle = gifski.Start(UserSettings.All.GifskiQuality, UserSettings.All.Looped); ThreadPool.QueueUserWorkItem(delegate { Thread.Sleep(500); SetStatus(Status.Processing, id, null, false); for (var i = 0; i < listFrames.Count; i++) { Update(id, i, string.Format(processing, i)); gifski.AddFrame(handle, (uint)i, listFrames[i].Path, listFrames[i].Delay); } gifski.EndAdding(handle); }, null); gifski.End(handle, param.Filename); var fileInfo2 = new FileInfo(param.Filename); if (!fileInfo2.Exists || fileInfo2.Length == 0) { throw new Exception("Error while encoding the gif with Gifski.", new Win32Exception()) { HelpLink = $"Command:\n\r{param.Command}\n\rResult:\n\r{Marshal.GetLastWin32Error()}" } } ; #endregion break; default: throw new Exception("Undefined Gif encoder type"); } #endregion break; case Export.Apng: #region Apng #region Cut/Paint Unchanged Pixels if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.A, param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } #endregion #region Encoding using (var stream = new MemoryStream()) { var frameCount = listFrames.Count(x => x.HasArea); using (var encoder = new Apng(stream, frameCount, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Apng Encoding"); } } #endregion #endregion break; case Export.Video: #region Video switch (param.VideoEncoder) { case VideoEncoderType.AviStandalone: #region Avi Standalone var image = listFrames[0].Path.SourceFrom(); if (File.Exists(param.Filename)) { File.Delete(param.Filename); } //1000 / listFrames[0].Delay using (var aviWriter = new AviWriter(param.Filename, param.Framerate, image.PixelWidth, image.PixelHeight, param.VideoQuality)) { var numImage = 0; foreach (var frame in listFrames) { using (var outStream = new MemoryStream()) { var bitImage = frame.Path.SourceFrom(); var enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitImage)); enc.Save(outStream); outStream.Flush(); using (var bitmap = new Bitmap(outStream)) aviWriter.AddFrame(bitmap, param.FlipVideo); } Update(id, numImage, string.Format(processing, numImage)); numImage++; #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } #endregion break; case VideoEncoderType.Ffmpg: #region Video using FFmpeg SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsFfmpegPresent()) { throw new ApplicationException("FFmpeg not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } #region Generate concat var concat = new StringBuilder(); foreach (var frame in listFrames) { concat.AppendLine("file '" + frame.Path + "'"); concat.AppendLine("duration " + (frame.Delay / 1000d).ToString(CultureInfo.InvariantCulture)); } var concatPath = Path.GetDirectoryName(listFrames[0].Path) ?? Path.GetTempPath(); var concatFile = Path.Combine(concatPath, "concat.txt"); if (!Directory.Exists(concatPath)) { Directory.CreateDirectory(concatPath); } if (File.Exists(concatFile)) { File.Delete(concatFile); } File.WriteAllText(concatFile, concat.ToString()); #endregion param.Command = string.Format(param.Command, concatFile, param.ExtraParameters.Replace("{H}", param.Height.ToString()).Replace("{W}", param.Width.ToString()), param.Filename); var process = new ProcessStartInfo(UserSettings.All.FfmpegLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro = Process.Start(process); var str = pro.StandardError.ReadToEnd(); var fileInfo = new FileInfo(param.Filename); if (!fileInfo.Exists || fileInfo.Length == 0) { throw new Exception("Error while encoding with FFmpeg.") { HelpLink = str } } ; #endregion break; default: throw new Exception("Undefined video encoder"); } #endregion break; default: throw new ArgumentOutOfRangeException(nameof(param)); } //If it was canceled, try deleting the file. if (tokenSource.Token.IsCancellationRequested) { if (File.Exists(param.Filename)) { File.Delete(param.Filename); } SetStatus(Status.Canceled, id); return; } #region Upload if (param.Upload && File.Exists(param.Filename)) { InternalUpdate(id, "Encoder.Uploading", true, true); try { ICloud cloud = CloudFactory.CreateCloud(param.UploadDestinationIndex); var uploadedFile = await cloud.UploadFileAsync(param.Filename, CancellationToken.None); InternalSetUpload(id, true, uploadedFile.Link, uploadedFile.DeleteLink); } catch (Exception e) { LogWriter.Log(e, "It was not possible to run the post encoding command."); InternalSetUpload(id, false, null, null, e); } } #endregion #region Copy to clipboard if (param.CopyToClipboard && File.Exists(param.Filename)) { Dispatcher.Invoke(() => { try { var data = new DataObject(); switch (param.CopyType) { case CopyType.File: if (param.Type != Export.Video) { data.SetImage(param.Filename.SourceFrom()); } data.SetText(param.Filename, TextDataFormat.Text); data.SetFileDropList(new StringCollection { param.Filename }); break; case CopyType.FolderPath: data.SetText(Path.GetDirectoryName(param.Filename) ?? param.Filename, TextDataFormat.Text); break; case CopyType.Link: var link = InternalGetUpload(id); data.SetText(string.IsNullOrEmpty(link) ? param.Filename : link, TextDataFormat.Text); break; default: data.SetText(param.Filename, TextDataFormat.Text); break; } //It tries to set the data to the clipboard 10 times before failing it to do so. //This issue may happen if the clipboard is opened by any clipboard manager. for (var i = 0; i < 10; i++) { try { Clipboard.SetDataObject(data, true); break; } catch (COMException ex) { if ((uint)ex.ErrorCode != 0x800401D0) //CLIPBRD_E_CANT_OPEN { throw; } } Thread.Sleep(100); } InternalSetCopy(id, true); } catch (Exception e) { LogWriter.Log(e, "It was not possible to copy the file."); InternalSetCopy(id, false, e); } }); } #endregion #region Execute commands if (param.ExecuteCommands && !string.IsNullOrWhiteSpace(param.PostCommands)) { InternalUpdate(id, "Encoder.Executing", true, true); var command = param.PostCommands.Replace("{p}", "\"" + param.Filename + "\"").Replace("{f}", "\"" + Path.GetDirectoryName(param.Filename) + "\""); var output = ""; try { foreach (var com in command.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)) { var procStartInfo = new ProcessStartInfo("cmd", "/c " + com) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (var process = new Process()) { process.StartInfo = procStartInfo; process.Start(); var message = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(error)) { throw new Exception(error); } process.WaitForExit(1000); } } InternalSetCommand(id, true, command, output); } catch (Exception e) { LogWriter.Log(e, "It was not possible to run the post encoding command."); InternalSetCommand(id, false, command, output, e); } } #endregion if (!tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Completed, id, param.Filename); } } catch (Exception ex) { LogWriter.Log(ex, "Encode"); SetStatus(Status.Error, id, null, false, ex); } finally { #region Delete Encoder Folder try { var encoderFolder = Path.GetDirectoryName(listFrames[0].Path); if (!string.IsNullOrEmpty(encoderFolder)) { if (Directory.Exists(encoderFolder)) { Directory.Delete(encoderFolder, true); } } } catch (Exception ex) { LogWriter.Log(ex, "Cleaning the Encode folder"); } #endregion GC.Collect(); } }
private void btnCopySingleLine_Click(object sender, RoutedEventArgs e) { Clipboard.SetDataObject(tbxSingleLine.Text, true); }
private void Encode(List <FrameInfo> listFrames, int id, Parameters param, CancellationTokenSource tokenSource) { var processing = this.DispatcherStringResource("Encoder.Processing"); try { switch (param.Type) { case Export.Gif: #region Gif #region Cut/Paint Unchanged Pixels if (param.EncoderType == GifEncoderType.Legacy || param.EncoderType == GifEncoderType.ScreenToGif) { if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } } #endregion switch (param.EncoderType) { case GifEncoderType.ScreenToGif: #region Improved encoding using (var stream = new MemoryStream()) { using (var encoder = new GifFile(stream, param.RepeatCount)) { encoder.UseGlobalColorTable = param.UseGlobalColorTable; encoder.TransparentColor = param.DummyColor; encoder.MaximumNumberColor = param.MaximumNumberColors; for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Improved Encoding"); } } #endregion break; case GifEncoderType.Legacy: #region Legacy Encoding using (var encoder = new AnimatedGifEncoder()) { if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); encoder.SetTransparent(color); encoder.SetDispose(1); //Undraw Method, "Leave". } encoder.Start(param.Filename); encoder.SetQuality(param.Quality); encoder.SetRepeat(param.RepeatCount); var numImage = 0; foreach (var frame in listFrames) { #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion if (!frame.HasArea && param.DetectUnchangedPixels) { continue; } var bitmapAux = new Bitmap(frame.Path); encoder.SetDelay(frame.Delay); encoder.AddFrame(bitmapAux, frame.Rect.X, frame.Rect.Y); bitmapAux.Dispose(); Update(id, numImage, string.Format(processing, numImage)); numImage++; } } #endregion break; case GifEncoderType.PaintNet: #region paint.NET encoding using (var stream = new MemoryStream()) { using (var encoder = new GifEncoder(stream, null, null, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { var bitmapAux = new Bitmap(listFrames[i].Path); encoder.AddFrame(bitmapAux, 0, 0, TimeSpan.FromMilliseconds(listFrames[i].Delay)); bitmapAux.Dispose(); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } stream.Position = 0; try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, Constants.BufferSize, false)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Encoding with paint.Net."); } } #endregion break; case GifEncoderType.FFmpeg: #region FFmpeg encoding SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsFfmpegPresent()) { throw new ApplicationException("FFmpeg not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } #region Generate concat var concat = new StringBuilder(); foreach (var frame in listFrames) { concat.AppendLine("file '" + frame.Path + "'"); concat.AppendLine("duration " + (frame.Delay / 1000d).ToString(CultureInfo.InvariantCulture)); } var concatPath = Path.GetDirectoryName(listFrames[0].Path) ?? Path.GetTempPath(); var concatFile = Path.Combine(concatPath, "concat.txt"); if (!Directory.Exists(concatPath)) { Directory.CreateDirectory(concatPath); } if (File.Exists(concatFile)) { File.Delete(concatFile); } File.WriteAllText(concatFile, concat.ToString()); #endregion param.Command = string.Format(param.Command, concatFile, param.ExtraParameters.Replace("{H}", param.Height.ToString()).Replace("{W}", param.Width.ToString()), param.Filename); var process = new ProcessStartInfo(UserSettings.All.FfmpegLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro = Process.Start(process); var str = pro.StandardError.ReadToEnd(); var fileInfo = new FileInfo(param.Filename); if (!fileInfo.Exists || fileInfo.Length == 0) { throw new Exception("Error while encoding the gif with FFmpeg.") { HelpLink = str } } ; #endregion break; case GifEncoderType.Gifski: #region Gifski encoding SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsGifskiPresent()) { throw new ApplicationException("Gifski not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } var outputPath = Path.GetDirectoryName(listFrames[0].Path); var fps = !param.ExtraParameters.Contains("--fps") ? "--fps " + (int)(1000d / listFrames.Average(x => x.Delay)) : ""; param.Command = $"{param.ExtraParameters} {fps} -o \"{param.Filename}\" \"{Path.Combine(outputPath, "*.png")}\""; var process2 = new ProcessStartInfo(UserSettings.All.GifskiLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro2 = Process.Start(process2); var str2 = pro2.StandardError.ReadToEnd(); var fileInfo2 = new FileInfo(param.Filename); if (!fileInfo2.Exists || fileInfo2.Length == 0) { throw new Exception("Error while encoding the gif with Gifski.") { HelpLink = str2 } } ; #endregion break; default: throw new Exception("Undefined Gif encoder type"); } #endregion break; case Export.Apng: #region Apng #region Cut/Paint Unchanged Pixels if (param.DetectUnchangedPixels) { Update(id, 0, FindResource("Encoder.Analyzing").ToString()); if (param.DummyColor.HasValue) { var color = Color.FromArgb(param.DummyColor.Value.A, param.DummyColor.Value.R, param.DummyColor.Value.G, param.DummyColor.Value.B); listFrames = ImageMethods.PaintTransparentAndCut(listFrames, color, id, tokenSource); } else { listFrames = ImageMethods.CutUnchanged(listFrames, id, tokenSource); } } else { var size = listFrames[0].Path.ScaledSize(); listFrames.ForEach(x => x.Rect = new Int32Rect(0, 0, (int)size.Width, (int)size.Height)); } #endregion #region Encoding using (var stream = new MemoryStream()) { var frameCount = listFrames.Count(x => x.HasArea); using (var encoder = new Apng(stream, frameCount, param.RepeatCount)) { for (var i = 0; i < listFrames.Count; i++) { if (!listFrames[i].HasArea && param.DetectUnchangedPixels) { continue; } if (listFrames[i].Delay == 0) { listFrames[i].Delay = 10; } encoder.AddFrame(listFrames[i].Path, listFrames[i].Rect, listFrames[i].Delay); Update(id, i, string.Format(processing, i)); #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } try { using (var fileStream = new FileStream(param.Filename, FileMode.Create, FileAccess.Write, FileShare.None, 4096)) stream.WriteTo(fileStream); } catch (Exception ex) { SetStatus(Status.Error, id); LogWriter.Log(ex, "Apng Encoding"); } } #endregion #endregion break; case Export.Video: #region Video switch (param.VideoEncoder) { case VideoEncoderType.AviStandalone: #region Avi Standalone var image = listFrames[0].Path.SourceFrom(); if (File.Exists(param.Filename)) { File.Delete(param.Filename); } //1000 / listFrames[0].Delay using (var aviWriter = new AviWriter(param.Filename, param.Framerate, image.PixelWidth, image.PixelHeight, param.VideoQuality)) { var numImage = 0; foreach (var frame in listFrames) { using (var outStream = new MemoryStream()) { var bitImage = frame.Path.SourceFrom(); var enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(bitImage)); enc.Save(outStream); outStream.Flush(); using (var bitmap = new Bitmap(outStream)) aviWriter.AddFrame(bitmap, param.FlipVideo); } Update(id, numImage, string.Format(processing, numImage)); numImage++; #region Cancellation if (tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Canceled, id); break; } #endregion } } #endregion break; case VideoEncoderType.Ffmpg: #region Video using FFmpeg SetStatus(Status.Processing, id, null, true); if (!Util.Other.IsFfmpegPresent()) { throw new ApplicationException("FFmpeg not present."); } if (File.Exists(param.Filename)) { File.Delete(param.Filename); } #region Generate concat var concat = new StringBuilder(); foreach (var frame in listFrames) { concat.AppendLine("file '" + frame.Path + "'"); concat.AppendLine("duration " + (frame.Delay / 1000d).ToString(CultureInfo.InvariantCulture)); } var concatPath = Path.GetDirectoryName(listFrames[0].Path) ?? Path.GetTempPath(); var concatFile = Path.Combine(concatPath, "concat.txt"); if (!Directory.Exists(concatPath)) { Directory.CreateDirectory(concatPath); } if (File.Exists(concatFile)) { File.Delete(concatFile); } File.WriteAllText(concatFile, concat.ToString()); #endregion param.Command = string.Format(param.Command, concatFile, param.ExtraParameters.Replace("{H}", param.Height.ToString()).Replace("{W}", param.Width.ToString()), param.Filename); var process = new ProcessStartInfo(UserSettings.All.FfmpegLocation) { Arguments = param.Command, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, RedirectStandardError = true }; var pro = Process.Start(process); var str = pro.StandardError.ReadToEnd(); var fileInfo = new FileInfo(param.Filename); if (!fileInfo.Exists || fileInfo.Length == 0) { throw new Exception("Error while encoding with FFmpeg.") { HelpLink = str } } ; #endregion break; default: throw new Exception("Undefined video encoder"); } #endregion break; default: throw new ArgumentOutOfRangeException(nameof(param)); } //If it was canceled, try deleting the file. if (tokenSource.Token.IsCancellationRequested) { if (File.Exists(param.Filename)) { File.Delete(param.Filename); } SetStatus(Status.Canceled, id); return; } #region Upload if (param.Upload && File.Exists(param.Filename)) { InternalUpdate(id, "Encoder.Uploading", true, true); try { //TODO: Make it less hardcoded. switch (param.UploadDestinationIndex) { case 0: //Imgur. using (var w = new WebClient()) { w.Headers.Add("Authorization", "Client-ID " + Secret.ImgurId); var values = new NameValueCollection { { "image", Convert.ToBase64String(File.ReadAllBytes(param.Filename)) } }; var response = w.UploadValues("https://api.imgur.com/3/upload.xml", values); var x = XDocument.Load(new MemoryStream(response)); var node = x.Descendants().FirstOrDefault(n => n.Name == "link"); var nodeHash = x.Descendants().FirstOrDefault(n => n.Name == "deletehash"); if (node == null) { throw new Exception("No link was provided by Imgur", new Exception(x.Document?.ToString() ?? "The document was null. :/")); } InternalSetUpload(id, true, node.Value, "https://imgur.com/delete/" + nodeHash?.Value); } break; case 1: //Gfycat. using (var client = new HttpClient()) { using (var res = client.PostAsync(@"https://api.gfycat.com/v1/gfycats", null).Result) { var result = res.Content.ReadAsStringAsync().Result; //{"isOk":true,"gfyname":"ThreeWordCode","secret":"15alphanumerics","uploadType":"filedrop.gfycat.com"} var ser = new JavaScriptSerializer(); if (!(ser.DeserializeObject(result) is Dictionary <string, object> thing)) { throw new Exception("It was not possible to get the gfycat name: " + res); } var name = thing["gfyname"] as string; using (var content = new MultipartFormDataContent()) { content.Add(new StringContent(name), "key"); content.Add(new ByteArrayContent(File.ReadAllBytes(param.Filename)), "file", name); using (var res2 = client.PostAsync("https://filedrop.gfycat.com", content).Result) { if (!res2.IsSuccessStatusCode) { throw new Exception("It was not possible to get the gfycat upload result: " + res2); } //{"task": "complete", "gfyname": "ThreeWordCode"} //{"progress": "0.03", "task": "encoding", "time": 10} //If the task is not yet completed, try waiting. var input2 = ""; while (!input2.Contains("complete")) { using (var res3 = client.GetAsync("https://api.gfycat.com/v1/gfycats/fetch/status/" + name).Result) { input2 = res3.Content.ReadAsStringAsync().Result; if (!res3.IsSuccessStatusCode) { throw new Exception("It was not possible to get the gfycat upload status: " + res3); } } if (!input2.Contains("complete")) { Thread.Sleep(1000); } } if (res2.IsSuccessStatusCode) { InternalSetUpload(id, true, "https://gfycat.com/" + name); } } } } } break; } } catch (Exception e) { LogWriter.Log(e, "It was not possible to run the post encoding command."); InternalSetUpload(id, false, null, null, e); } } #endregion #region Copy to clipboard if (param.CopyToClipboard && File.Exists(param.Filename)) { Dispatcher.Invoke(() => { try { var data = new DataObject(); switch (param.CopyType) { case CopyType.File: if (param.Type != Export.Video) { data.SetImage(param.Filename.SourceFrom()); } data.SetText(param.Filename, TextDataFormat.Text); data.SetFileDropList(new StringCollection { param.Filename }); break; case CopyType.FolderPath: data.SetText(Path.GetDirectoryName(param.Filename) ?? param.Filename, TextDataFormat.Text); break; case CopyType.Link: data.SetText(param.Filename, TextDataFormat.Text); //TODO: Link. break; default: data.SetText(param.Filename, TextDataFormat.Text); break; } Clipboard.SetDataObject(data, true); InternalSetCopy(id, true); } catch (Exception e) { LogWriter.Log(e, "It was not possible to copy the file."); InternalSetCopy(id, false, e); } }); } #endregion #region Execute commands if (param.ExecuteCommands && !string.IsNullOrWhiteSpace(param.PostCommands)) { InternalUpdate(id, "Encoder.Executing", true, true); var command = param.PostCommands.Replace("{p}", "\"" + param.Filename + "\"").Replace("{f}", "\"" + Path.GetDirectoryName(param.Filename) + "\""); var output = ""; try { foreach (var com in command.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)) { var procStartInfo = new ProcessStartInfo("cmd", "/c " + com) { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true }; using (var process = new Process()) { process.StartInfo = procStartInfo; process.Start(); var message = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(message)) { output += message + Environment.NewLine; } if (!string.IsNullOrWhiteSpace(error)) { throw new Exception(error); } process.WaitForExit(1000); } } InternalSetCommand(id, true, command, output); } catch (Exception e) { LogWriter.Log(e, "It was not possible to run the post encoding command."); InternalSetCommand(id, false, command, output, e); } } #endregion if (!tokenSource.Token.IsCancellationRequested) { SetStatus(Status.Completed, id, param.Filename); } } catch (Exception ex) { LogWriter.Log(ex, "Encode"); SetStatus(Status.Error, id, null, false, ex); } finally { #region Delete Encoder Folder try { var encoderFolder = Path.GetDirectoryName(listFrames[0].Path); if (!string.IsNullOrEmpty(encoderFolder)) { if (Directory.Exists(encoderFolder)) { Directory.Delete(encoderFolder, true); } } } catch (Exception ex) { LogWriter.Log(ex, "Cleaning the Encode folder"); } #endregion GC.Collect(); } }
private void BtnCopyURL_Click(object sender, RoutedEventArgs e) { // Copies the song info URL to the clipboard and shows notification Clipboard.SetDataObject("https://songify.rocks/getsong.php?id=" + Settings.Uuid); Lbl_Status.Content = @"URL copied to clipboard."; }