none
Bild aus Zwischenablage speichern RRS feed

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($"![image](/posts/2018/{System.IO.Path.GetFileName(fileName)})");
            }
          }
        }
      }
    }

    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($"![image](/posts/2018/{System.IO.Path.GetFileName(fileName)})");
          }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Dienstag, 16. Juli 2019 04:44

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.


    Montag, 15. Juli 2019 12:30
  • ... Diese Usings stehen mir nicht zur Verfügung. Kann es sein, dass diese in einer Konsolenapp nicht zur Verfügung gestellt werden? 

    .::datekk::.

    Montag, 15. Juli 2019 13:25
  • 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

    Montag, 15. Juli 2019 13:28
    Moderator
  • Wie füge ich denn "einen Verweis auf die Assamblies" hinzu?

    Ich kenne da nur die Using Anweisung zu Beginn einer Datei. Und hier gibt es kein System.Windows.Forms und Bei System.Drawing gibt es keine System.Drawing.Image...


    .::datekk::.

    Montag, 15. Juli 2019 13:33
  • Ich finde System.Windows.Forms und System.Drawing auch nicht im WPF Mode.

    Was mache ich denn falsch?


    .::datekk::.

    Montag, 15. Juli 2019 15:09
  • 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

    Montag, 15. Juli 2019 15:29
    Moderator
  • 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
    Montag, 15. Juli 2019 16:06
  • Das Fenster beinhaltet keine Elemente zum zufügen....


    .::datekk::.


    • Bearbeitet datekk2 Montag, 15. Juli 2019 16:19
    Montag, 15. Juli 2019 16:13
  • 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:

      .NET Core Image Processing


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 15. Juli 2019 18:42
    Moderator
  • 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
    Montag, 15. Juli 2019 19:11
  • 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($"![image](/posts/2018/{System.IO.Path.GetFileName(fileName)})");
            }
          }
        }
      }
    }

    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($"![image](/posts/2018/{System.IO.Path.GetFileName(fileName)})");
          }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Dienstag, 16. Juli 2019 04:44