![]() |
JPEG Error
Hi Delphianers
Ich erzeuge einen Screenshot als Bitmap diesen Wandle ich in ein JPG um. Nach ca. 60x Schreenshot erzeugen bekomme ich ne Error meldung "Zur verabeitung dieses Befehls sind nicht genügens Speicherressourcen verfügbar.
Delphi-Quellcode:
function GetScreenShot: TBitmap;
var Desktop: HDC; begin Result := TBitmap.Create; Desktop := GetDC(0); try try Result.PixelFormat := pf32bit; Result.Width := Screen.Width; Result.Height := Screen.Height; BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY); Result.Modified := True; finally ReleaseDC(0, Desktop); end; except Result.Free; Result := nil; end; end; Function SaveShotToStream(PIC: TBitmap): AnsiString; var myjpg: TJPEGImage; myImg: TImage; mm: TMemoryStream; begin mm := TMemoryStream.Create; myImg:= TImage.Create(nil); myjpg := TJPEGImage.Create; myjpg.CompressionQuality := 50; myjpg.Compress; myimg.Picture.Bitmap := GetScreenShot; myjpg.Assign(myimg.Picture.Bitmap); myjpg.SaveToStream(mm); myImg.Free; myjpg.Free; mm.Free; end; |
AW: JPEG Error
Delphi-Quellcode:
wird nicht freigegeben.
myimg.Picture.Bitmap
Delphi-Quellcode:
kann man nicht aufrufen. Korrekt weist man Bilder mit
myimg.Picture.Bitmap.Free();
Delphi-Quellcode:
zu, da wird das alte Bild gelöscht. Die Verwendung von TImage ist hier sowieso komplett fehl am Platze, ganz zu schweigen vom fehlenden try..finally. Da war ich jetzt aber zu faul für, das auch noch zu ergänzen.
myimg.Picture.Assign(Bild);
Delphi-Quellcode:
Function SaveShotToStream(PIC: TBitmap): AnsiString;
var myjpg: TJPEGImage; mybmp: Graphics.TBitmap; mm: TMemoryStream; begin mm := TMemoryStream.Create; myjpg := TJPEGImage.Create; myjpg.CompressionQuality := 50; myjpg.Compress; mybmp := GetScreenShot; myjpg.Assign(mybmp); mybmp.Free; myjpg.SaveToStream(mm); myImg.Free; myjpg.Free; mm.Free; end; |
AW: JPEG Error
Zitat:
Wenn
Delphi-Quellcode:
etwas zugewiesen wird, dann erfolgt intern ein Assign.
TPicture.Bitmap
Es ist also wurscht ob man
Delphi-Quellcode:
oder
pic.Bitmap := myBmp;
Delphi-Quellcode:
schreibt, denn es passiert das Gleiche.
pic.Bitmap.Assign(myBmp);
Was hier nicht freigegeben wird, ist die Bitmap-Instanz die man per
Delphi-Quellcode:
holt.
GetScreenshot
Delphi-Quellcode:
Allerdings ist der Umweg über
Function SaveShotToStream(PIC: TBitmap): AnsiString;
var myjpg: TJPEGImage; myImg: TImage; mm: TMemoryStream; bmp: TBitmap; begin mm := TMemoryStream.Create; myImg:= TImage.Create(nil); myjpg := TJPEGImage.Create; myjpg.CompressionQuality := 50; myjpg.Compress; bmp := GetScreenShot; try myimg.Picture.Bitmap := bmp; finally bmp.Free; end; myjpg.Assign(myimg.Picture.Bitmap); myjpg.SaveToStream(mm); myImg.Free; myjpg.Free; mm.Free; end;
Delphi-Quellcode:
hier nicht notwendig und
TImage
Delphi-Quellcode:
könnte man gleich
bmp
Delphi-Quellcode:
zuweisen.
myjpg
|
AW: JPEG Error
Und wo ist das PIC das übergeben wird?
Wenn es nicht verarbeitet wird in dieser Funktion sondern über
Delphi-Quellcode:
bmp := GetScreenShot;
eingeholt wird dann benötigt man die Übergabe in der Funktion auch nicht. Genauso wie die Rückgabe AnsiString die Funktion ist einfach unsinnig! Zitat:
Man holt den Screenshot über GetScreenShot außerhalb der Funktion und übergibt dann das Resultat an die Funktion als PIC. Anschließend kann man bmp das PIC zuweisen. gruss |
AW: JPEG Error
Dann macht mans so
Delphi-Quellcode:
Gruß
procedure GetScreenShot(var mybm: TBitmap);
K-H P.s. c&P at ist best |
AW: JPEG Error
Zitat:
Ob man das jetzt über eine Function regelt oder über eine Procedure spielt eigentlich keine rolle. Ist Auslegungssache. Wichtig ist doch nur das ein Bitmap zurückgegeben wird.
Delphi-Quellcode:
gruss
procedure TForm1.Button1Click(Sender: TObject);
var bmp :TBitmap; begin bmp := GetScreenShot; // TBitmap das zurückgegeben wird SaveShotToStream(bmp) bmp.Free; end; procedure SaveShotToStream(PIC: TBitmap); // bla, bla bmp := PIC; //hier nix mit bmp.free wird nachher freigegeben. |
AW: JPEG Error
Zitat:
sowie in der anderen Funktion sämtliche Ressourcenschutzblöcke vergaß ............ schön viele Speichlecks usw. |
AW: JPEG Error
Zitat:
Ich habe aus eigener schmerzlicher Erfahrung lernen müssen, daß der Satz seine Berechtigung hat. Darum sollte die Bitmap an die Scrennshot-Routine übergeben werden. Das erleichtert die Fehlersuche doch ungemein. Gruß K-H |
AW: JPEG Error
Zitat:
Ziehe meinen Einwand zurück. Davon ab diesen C&P Code kann man eh vergessen, wie dem auch sei. gruss |
AW: JPEG Error
Zitat:
Zitat:
Delphi-Quellcode:
Argument? Das macht doch gar keinen Sinn. Denn diesen Referenz-Zeiger die man hineingibt will man doch nicht in der Methode ändern.
var
Da sollte man besser ein
Delphi-Quellcode:
von machen (was im Hinblick auf ARC auch noch einen Vorteil bringt).
const
Also
Delphi-Quellcode:
.
procedure GetScreenShot(const mybm: TBitmap);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz