[ERLEDIGT] [wxWidgets] Bitmap aus Clipboard laden und in Datei abspeichern



  • Hallo,

    Mir geht's darum, die Zwischenablage von Windows auszulesen, prüfen ob sich darin ein Bitmap (Screenshot) befindet, wenn ja dann dieses Bitmap in einer Datei abspeichern. Dies habe ich folgendermaßen erledigt, allerdings scheitert dann das Erstellen und Abspeichern des Bitmaps, habe es kommentiert:

    wxClipboard     *ClipBrd;
    wxBitmapHandler *BmpHandler;
    wxBitmap        *bitmap;
    char            *buff;
    
    wxBitmapDataObject data;
    buff       = new char [6310720];
    ClipBrd    = new wxClipboard ();
    BmpHandler = new wxBitmapHandler;
    bitmap     = new wxBitmap (800, 600, -1);
    
    if (ClipBrd->Open ())
    {
         if (ClipBrd->IsSupported (wxDF_BITMAP))
         {
             ClipBrd->GetData (data);
             data.GetDataHere (wxDF_BITMAP, buff);
             // Schlägt fehl!
             BmpHandler->Create (bitmap, buff, wxBITMAP_TYPE_BMP, 800, 600, -1);
             //Ebenfalls fehlgeschlagen!
             BmpHandler->SaveFile (bitmap, "wxBitmap.bmp", wxBITMAP_TYPE_BMP, NULL);
         }
    }
    ClipBrd->Close ();
    

    Was habe ich falsch gemacht?

    MfG mikey.



  • Na, Leute da muss sich doch was machen lassen...


  • Mod

    Naja, Create schlägt fehl.
    Was soll man dazu noch sagen?
    Evtl. schon mal den direkten Bitmap Konstuktor probiert?
    Ist der Handler überhaupt initialisiert?



  • Hi,

    es ist der ganze Code, den ich da gepostet habe. Ich kenne mich ja nicht aus, habe es mir selbstständig aus der Dokumentation zusammengestellt. Demnach weis ich auch nicht, ob und welchen Handler ich initialisieren soll. Könntest du mir da auf die Sprünge helfen, zumindest einen Tipp geben, was ich noch machen muss?

    PS.: Die beiden Funktionen "Create ()" und "SaveFile ()" geben false zurück, es handelt sich also nicht um Exceptions etc.!

    Danke schonmal für die Hilfe

    MfG mikey.


  • Mod

    Hast du denn den Handler initialisiert?

    wxImage::AddHandler(new wxBMPHandler());
    


  • Ne, habe ich nicht. hab's jetzt mal Deine Codezeile ganz am Anfang eingebaut, aber die beiden Funktionen geben immernoch false zurück... Wiegesagt, das ist der __volle__ Originalcode, also demnach war es ersichtlich, dass ich den Handler nicht initialisiert habe. Vielleicht habe ich noch was vergessen? Bin für jegliche Hilfe sehr dankbar, es ist wichtig 🙂



  • Moin, ich brauchte sowas auch mal. Hier meine Lösung (läuft in meiner App) :

    if (wxTheClipboard->Open())
    	{
    		if (wxTheClipboard->IsSupported(wxDF_BITMAP))
    		{
    			wxBitmapDataObject data;
    			wxTheClipboard->GetData(data);
    
    			wxString sPath = "clip.bmp"
    
    			wxBitmap picture = data.GetBitmap();
    			picture.SaveFile(sPath, wxBITMAP_TYPE_JPEG);
    
    		}
    		else
    			wxMessageBox("Es befindet sich KEIN Bitmap in der Zwischenablage.");
    
        wxTheClipboard->Close();
    	}
    

  • Mod

    Also eigentlich sind imho die Handler nicht zur direkten Benutzung gedacht,
    was passiert wenn du statt dessen ein wxBitmap Objekt direkt erzeugst?



  • Hi,

    erstmal vielen Dank SciFi, der Code funktioniert! 🙂

    phlox81 schrieb:

    was passiert wenn du statt dessen ein wxBitmap Objekt direkt erzeugst?

    Was meinst du mit direkt? Es geht natürlich auch, wenn man erst ein wxBitmap-Objekt auf dem Heap erzeugt, und dann darauf zugreift, also so:

    wxBitmap *picture = new wxBitmap (800, 600, -1);
    if (wxTheClipboard->Open())
        {
            if (wxTheClipboard->IsSupported(wxDF_BITMAP))
            {
                wxBitmapDataObject data;
                wxTheClipboard->GetData(data);
    
                wxString sPath = "clip.bmp"
    
                (*picture) = data.GetBitmap();
                picture->SaveFile(sPath, wxBITMAP_TYPE_JPEG);
    
            }
            else
                wxMessageBox("Es befindet sich KEIN Bitmap in der Zwischenablage.");
    
        wxTheClipboard->Close();
        }
    

    ...so funktioniert es auch.



  • Oh, phlox81, bei dir möchte ich mich auch noch für den guten Tipp bedanken, ohne den Initialisierer hätte ich es wohl nicht hinbekommen 😉 Gibt anscheinend nicht mehr viel zu sagen zu dem Thema, also markiere ich den Thread mal als "erledigt"


Log in to reply