Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JPEG Error (https://www.delphipraxis.net/198155-jpeg-error.html)

Zodi 8. Okt 2018 22:18

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;

Redeemer 8. Okt 2018 22:21

AW: JPEG Error
 
Delphi-Quellcode:
myimg.Picture.Bitmap
wird nicht freigegeben.
Delphi-Quellcode:
myimg.Picture.Bitmap.Free();
kann man nicht aufrufen. Korrekt weist man Bilder mit
Delphi-Quellcode:
myimg.Picture.Assign(Bild);
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.

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;

Schokohase 8. Okt 2018 22:35

AW: JPEG Error
 
Zitat:

Zitat von Redeemer (Beitrag 1415261)
Delphi-Quellcode:
myimg.Picture.Bitmap
wird nicht freigegeben.
Delphi-Quellcode:
myimg.Picture.Bitmap.Free();
kann man nicht aufrufen. Korrekt weist man Bilder mit
Delphi-Quellcode:
myimg.Picture.Assign(Bild);
zu, da wird das alte Bild gelöscht.

Das stimmt so nicht.

Wenn
Delphi-Quellcode:
TPicture.Bitmap
etwas zugewiesen wird, dann erfolgt intern ein Assign.
Es ist also wurscht ob man
Delphi-Quellcode:
pic.Bitmap := myBmp;
oder
Delphi-Quellcode:
pic.Bitmap.Assign(myBmp);
schreibt, denn es passiert das Gleiche.

Was hier nicht freigegeben wird, ist die Bitmap-Instanz die man per
Delphi-Quellcode:
GetScreenshot
holt.

Delphi-Quellcode:
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;
Allerdings ist der Umweg über
Delphi-Quellcode:
TImage
hier nicht notwendig und
Delphi-Quellcode:
bmp
könnte man gleich
Delphi-Quellcode:
myjpg
zuweisen.

EWeiss 8. Okt 2018 22:40

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:

bmp könnte man gleich myjpg zuweisen.
nö wenn dann PIC schließlich wird es übergeben oder was soll das!

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

p80286 8. Okt 2018 22:44

AW: JPEG Error
 
Dann macht mans so
Delphi-Quellcode:
procedure GetScreenShot(var mybm: TBitmap);
Gruß
K-H

P.s.
c&P at ist best

EWeiss 8. Okt 2018 22:53

AW: JPEG Error
 
Zitat:

Zitat von p80286 (Beitrag 1415265)
Dann macht mans so
Delphi-Quellcode:
procedure GetScreenShot(var mybm: TBitmap);
Gruß
K-H

P.s.
c&P at ist best

Der sinn hinter deiner procedure erschließt sich mir auch nicht. Sorry.
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:
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.
gruss

himitsu 9. Okt 2018 10:11

AW: JPEG Error
 
Zitat:

Delphi-Quellcode:
  except
    Result.Free;
    Result := nil;
  end;

Ich würde ja mal vermuten der kommt öfters dort rein und da irgendein Idiot Typ hier Fehlermeldungen grob fahrlässig unterdrückt und vernichtet,
sowie in der anderen Funktion sämtliche Ressourcenschutzblöcke vergaß ............ schön viele Speichlecks usw.

p80286 9. Okt 2018 11:46

AW: JPEG Error
 
Zitat:

Zitat von EWeiss (Beitrag 1415266)
Wichtig ist doch nur das ein Bitmap zurückgegeben wird.

"Ein Objekt soll da freigegeben werden, wo es erstellt wird"
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

EWeiss 9. Okt 2018 11:55

AW: JPEG Error
 
Zitat:

Zitat von p80286 (Beitrag 1415308)
Zitat:

Zitat von EWeiss (Beitrag 1415266)
Wichtig ist doch nur das ein Bitmap zurückgegeben wird.

"Ein Objekt soll da freigegeben werden, wo es erstellt wird"
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

OK muss ich dir recht geben.
Ziehe meinen Einwand zurück.
Davon ab diesen C&P Code kann man eh vergessen, wie dem auch sei.

gruss

Schokohase 9. Okt 2018 13:02

AW: JPEG Error
 
Zitat:

Zitat von p80286 (Beitrag 1415308)
Zitat:

Zitat von EWeiss (Beitrag 1415266)
Wichtig ist doch nur das ein Bitmap zurückgegeben wird.

"Ein Objekt soll da freigegeben werden, wo es erstellt wird"
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

Ja, das sollte man so machen, aber warum dann
Zitat:

Zitat von p80286 (Beitrag 1415265)
Dann macht mans so
Delphi-Quellcode:
procedure GetScreenShot(var mybm: TBitmap);

also als
Delphi-Quellcode:
var
Argument? Das macht doch gar keinen Sinn. Denn diesen Referenz-Zeiger die man hineingibt will man doch nicht in der Methode ändern.

Da sollte man besser ein
Delphi-Quellcode:
const
von machen (was im Hinblick auf ARC auch noch einen Vorteil bringt).

Also
Delphi-Quellcode:
procedure GetScreenShot(const mybm: TBitmap);
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz