Benutzer mit den meisten Antworten
Bild aus Zwischenablage speichern

Frage
-
Hi,
ich möchte gern eine kleine Konsolenapp bauen, welche ein Bild aus der Zwischenablage in eine Datei abspeichert.
Ich habe verschiedene Links im Netz gefunden, allerdings zeigt mein Visual Studio immer Fehler an.
Z.B. hier:
https://markheath.net/post/save-clipboard-image-to-file
-> Fehler: Der Name Clipboard ist im aktuellen Kontext nicht vorhanden.
oder hier:
-> Fehler: Image konnte nicht im Namespace System.Drawing gefunden werden.
Kann mir jemand weiterhelfen?
.::datekk::.
Antworten
-
Hi,
nachfolgend eine Konsolenanwendung. Ich habe bewusst kein using genutzt, um an jeder Stelle zu erkennen, welche Namensräume angewandt werden:using System; namespace ConsoleApp1 { class Program1 { [STAThread] static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { internal void Execute() { string inp = @"c:\temp\x.jpg"; System.Drawing.Image img = System.Drawing.Image.FromFile(inp); System.Windows.Forms.Clipboard.SetImage(img); string fileName = @"c:\temp\x.png"; if (System.Windows.Forms.Clipboard.ContainsImage()) { System.Windows.Forms.Clipboard.GetImage().Save(fileName, System.Drawing.Imaging.ImageFormat.Png); System.Windows.Forms.Clipboard.SetText($"})"); } } } } }
Damit auch alle Namensräume aufgelöst werden können, sind die entsprechenden Verweise zu setzen:
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Auch in WPF funktioniert der Code-Schnipsel. Wichtig in WPF ist, dass Du auch die richtigen Namenräume nutzt, da es z.B. Image sowohl in den WPF-Namensräumen als auch in den Windows-Namensräumen gibt. ClipBoard will den Image-Typ aus dem System.Drawing-Namensraum, nicht aus dem PresentationFramework-Namensraum. Nach dem Hinzufügen der Verweise nutzt Du in WPF entweder die vollqualifizierte Schreibweise (System.Drawing.Image img …) oder Du nutzt Aliasnamen in den usings und im Code.
string inp = @"c:\temp\x.jpg"; System.Drawing.Image img = System.Drawing.Image.FromFile(inp); System.Windows.Forms.Clipboard.SetImage(img); string fileName = @"c:\temp\x.png"; if (System.Windows.Forms.Clipboard.ContainsImage()) { System.Windows.Forms.Clipboard.GetImage().Save(fileName, System.Drawing.Imaging.ImageFormat.Png); System.Windows.Forms.Clipboard.SetText($"})"); }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks- Bearbeitet Peter Fleischer Dienstag, 16. Juli 2019 04:59
- Als Antwort vorgeschlagen Peter Fleischer Dienstag, 16. Juli 2019 05:50
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Mittwoch, 24. Juli 2019 05:31
Alle Antworten
-
Clipboard findest du im Namespace System.Windows.Forms. Dann sollte es mit den Beispielen auch klappen :)
Füge deinem Projekt also Referenzen auf System.Windows.Forms und System.Drawing hinzu und entsprechend dann auch der Einfachheit halber ein using auf System.Windows.Forms; dann kannst du auf die Clipboard-Klasse zugreifen.
- Bearbeitet Christoph Biegner Montag, 15. Juli 2019 12:35
-
Hi,
Du musst schon einen Verweis auf die Assemblies hinzufügen, dann kannst Du auch auf die Namespaces und Klassen zugreifen.
Ob es nun allerdings wirklich Sinn macht, System.Windows.Forms, ... in einer Konsolen App zu verwenden, kann ich dir nicht sagen. System.Drawing kannst Du aber nutzen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Hi,
schau mal bitte hier, da siehst Du, wie Du einen Verweis hinzufügst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Die Methode zum holen eines Bitmap aus der Zwischenablage ist hier beschrieben: Clipboard.GetImage Method
Ein geeigneter Weg für eine Konsolenanwendung. Orientiere dich daran.
class Program { [STAThread] static void Main(string[] args) { var image = System.Windows.Clipboard.GetImage(); using (var fileStream = new FileStream("C:\\temp\\my.png", FileMode.Create)) { System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(image)); encoder.Save(fileStream); } } }
- Gruß Florian
- Bearbeitet Florian Haupt Dienstag, 16. Juli 2019 08:33 Beispiel
-
Hi,
aus solchen Gründen wie hier ist es immer ganz wichtig, exakte Informationen über die verwendete Projektart zu geben.
Du hast hier eine .NET Core Konsolenanwendung. Das ist etwas ganz anderes als es noch bei .NET Classic (also bis 4.8) war. Daher sieht deine Umgebung auch ganz anders aus.
Schau bitte mal hier nach möglichen Alternativen für dein Vorhaben:
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Ja, das habe ich in dem Moment als Du geantwortet hast auch festgestellt und ein neues Projekt aufgesetzt im NET Framework. Aber auch hier weder als KonsolenApp noch als WPF bekomme ich das zum laufen.
.::datekk::.
- Bearbeitet datekk2 Montag, 15. Juli 2019 19:12
-
Hi,
nachfolgend eine Konsolenanwendung. Ich habe bewusst kein using genutzt, um an jeder Stelle zu erkennen, welche Namensräume angewandt werden:using System; namespace ConsoleApp1 { class Program1 { [STAThread] static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { internal void Execute() { string inp = @"c:\temp\x.jpg"; System.Drawing.Image img = System.Drawing.Image.FromFile(inp); System.Windows.Forms.Clipboard.SetImage(img); string fileName = @"c:\temp\x.png"; if (System.Windows.Forms.Clipboard.ContainsImage()) { System.Windows.Forms.Clipboard.GetImage().Save(fileName, System.Drawing.Imaging.ImageFormat.Png); System.Windows.Forms.Clipboard.SetText($"})"); } } } } }
Damit auch alle Namensräume aufgelöst werden können, sind die entsprechenden Verweise zu setzen:
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Auch in WPF funktioniert der Code-Schnipsel. Wichtig in WPF ist, dass Du auch die richtigen Namenräume nutzt, da es z.B. Image sowohl in den WPF-Namensräumen als auch in den Windows-Namensräumen gibt. ClipBoard will den Image-Typ aus dem System.Drawing-Namensraum, nicht aus dem PresentationFramework-Namensraum. Nach dem Hinzufügen der Verweise nutzt Du in WPF entweder die vollqualifizierte Schreibweise (System.Drawing.Image img …) oder Du nutzt Aliasnamen in den usings und im Code.
string inp = @"c:\temp\x.jpg"; System.Drawing.Image img = System.Drawing.Image.FromFile(inp); System.Windows.Forms.Clipboard.SetImage(img); string fileName = @"c:\temp\x.png"; if (System.Windows.Forms.Clipboard.ContainsImage()) { System.Windows.Forms.Clipboard.GetImage().Save(fileName, System.Drawing.Imaging.ImageFormat.Png); System.Windows.Forms.Clipboard.SetText($"})"); }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks- Bearbeitet Peter Fleischer Dienstag, 16. Juli 2019 04:59
- Als Antwort vorgeschlagen Peter Fleischer Dienstag, 16. Juli 2019 05:50
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Mittwoch, 24. Juli 2019 05:31