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->ClientRectIch 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!?