TImage in Datei abspeichern



  • Hallo,

    ich habe die Methode für Screenshots (FAQ > Screenshots > Version 2) übernommen. Korrektur zur Methode: innerhalb der Methode wird Image1->ClientRect angesprochen, funktioniert zwar, macht aber den 2ten Parameter dann überflüssig und ist unschön. 🙂
    Also statt Image1->ClientRect einfach image->ClientRect

    Screenshot - Version 2

    Ich würde das Bild jetzt gerne abspeichern, bzw. speicher das auch ab. Aber wenn ich das dann mit einem Bildprogramm öffnen möchte, bekomme ich eine Fehlermeldung.

    TImage *img = new TImage(this);
    MakeScreenShot(this->Handle, img); // Methode aus der FAQ
    img->Picture->Graphic->SaveToFile("testscreen.bmp");
    delete img;
    

    [ Dieser Beitrag wurde am 10.07.2003 um 12:04 Uhr von Enrico Stahn editiert. ]



  • TImage::Picture::Bitmap::SaveToFile



  • img->Picture->Bitmap->SaveToFile("testscreen.bmp");
    

    Dann wird auch eine Datei abgespeichert, die eine Fehlermeldung beim öffnen mit einem Bildprogramm erzeugt.

    <edit>
    Also, mit MS Paint kann ich die Datei öffnen, aber mit PhotoImpact oder PhotoShop nicht. Obwohl ich andere Bitmaps die nicht vom BCB stammen mit PhotoImpact oder PhotoShop öffnen kann.
    </edit>

    [ Dieser Beitrag wurde am 10.07.2003 um 12:25 Uhr von Enrico Stahn editiert. ]



  • Aber im Image wird das Bild korrekt dargestellt?



  • Die FAQ Methode schrinkelt das Bild, auf 105px. Meine Methode sieht jetzt so aus:

    /**
    * Erstellt einen Screenshot von einem bestimmten Fenster
    */
    void __fastcall Tdgoee::MakeScreenShot(HWND handle, TImage* image)
    {
            TCanvas* canvas = new TCanvas();
            canvas->Handle = GetWindowDC(handle);
    
            TRect Dest = image->ClientRect;
            TRect Source;
            GetWindowRect(handle, (LPRECT)&Source);
            Source = Rect(0, 0, Source.Right - Source.Left, Source.Bottom - Source.Top);
    
            Dest.Left     = 0;
            Dest.Right    = Source.Right - Source.Left;
            Dest.Top      = 0;
            Dest.Bottom   = Source.Bottom - Source.Top;
            image->Width  = Source.Right - Source.Left;
            image->Height = Source.Bottom - Source.Top;
            image->Canvas->CopyRect(Dest, canvas, Source);
            delete canvas;
    }
    

    Desweiteren hab ich, da die Bitmaps die erzeugt werden nicht von z.B. PhotoShop gelesen werden könen, die Bilder in JPEG umgewandelt:

    TImage *img = new TImage(this);
    TJPEGImage *jpeg = new TJPEGImage();
    MakeScreenShot(this->Handle, img);
    jpeg->Assign(img->Picture->Bitmap);
    jpeg->SaveToFile("testscreen.jpg");
    delete jpeg;
    delete img;
    

    Meine Frage ist jetzt, kann man das ganze noch eleganter machen, so daß ich keine Instanz von TJPEGImage erzeugen muss? z.B. irgendwie mit

    img->Picture->RegisterFileFormat(__classid(TJPEGImage), "JPG", "JPG-Datei", __classid(TJPEGImage));
    

    enrico

    [ Dieser Beitrag wurde am 10.07.2003 um 13:36 Uhr von Enrico Stahn editiert. ]



  • Hier nochmal die Methoden zum erstellen und speichern von Screenshots, ohne das diese verkleinert werden. Vielleicht als Version 3 für die FAQ 😃

    /**
    * Erstellt einen Screenshot von einem bestimmten Fenster
    */
    void __fastcall Tdgoee::MakeScreenShot(HWND handle, TImage* image)
    {
            TCanvas* canvas = new TCanvas();
            canvas->Handle = GetWindowDC(handle);
    
            TRect Dest = image->ClientRect;
            TRect Source;
            GetWindowRect(handle, (LPRECT)&Source);
            Source = Rect(0, 0, Source.Right - Source.Left, Source.Bottom - Source.Top);
    
            Dest.Left     = 0;
            Dest.Right    = Source.Right - Source.Left;
            Dest.Top      = 0;
            Dest.Bottom   = Source.Bottom - Source.Top;
            image->Width  = Source.Right - Source.Left;
            image->Height = Source.Bottom - Source.Top;
            image->Canvas->CopyRect(Dest, canvas, Source);
            delete canvas;
    }
    
    /**
    * Speichert einen Screenshot von einem Fenster (handle)
    */
    void __fastcall Tdgoee::SaveScreenShot(HWND handle, AnsiString FileName)
    {
            if (FileName == "") {
                    return;
            }
    
            TImage *img      = new TImage(this);
            TJPEGImage *jpeg = new TJPEGImage();
    
            MakeScreenShot(handle, img);
    
            jpeg->ProgressiveEncoding = true;
            jpeg->CompressionQuality = 100;
            jpeg->Assign(img->Picture->Bitmap);
            jpeg->SaveToFile(FileName);
    
            delete jpeg;
            delete img;
    }
    


  • Setz mal vom dem Speichern das PixelFormat des Bitmaps, dann lässt sich das auch in Photoshop öffnen.

    Was das "schrinkeln" betrifft: Die FAQ-Methode bringt das Bild halt auf die bestehende Grösse des Images. Dass man dieses bei Bedarf an die Grösse des Originals anpassen muss ist doch offensichtlich.



  • Original erstellt von Jansen:
    ist doch offensichtlich.

    anscheinend nicht :p



  • Offensichtlich doch, denn das erste, was du gemacht hast, war doch das Anpassen der Image-Grösse!?


Anmelden zum Antworten