AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JPEG Error

Ein Thema von Zodi · begonnen am 8. Okt 2018 · letzter Beitrag vom 9. Okt 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Zodi
Zodi

Registriert seit: 18. Jul 2017
Ort: Berlin
45 Beiträge
 
Delphi XE7 Ultimate
 
#1

JPEG Error

  Alt 8. Okt 2018, 22:18
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;
Pascal
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.017 Beiträge
 
Delphi 2009 Professional
 
#2

AW: JPEG Error

  Alt 8. Okt 2018, 22:21
myimg.Picture.Bitmap wird nicht freigegeben. myimg.Picture.Bitmap.Free(); kann man nicht aufrufen. Korrekt weist man Bilder mit 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;
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer ( 8. Okt 2018 um 22:26 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: JPEG Error

  Alt 8. Okt 2018, 22:35
myimg.Picture.Bitmap wird nicht freigegeben. myimg.Picture.Bitmap.Free(); kann man nicht aufrufen. Korrekt weist man Bilder mit myimg.Picture.Assign(Bild); zu, da wird das alte Bild gelöscht.
Das stimmt so nicht.

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

Was hier nicht freigegeben wird, ist die Bitmap-Instanz die man per 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 TImage hier nicht notwendig und bmp könnte man gleich myjpg zuweisen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: JPEG Error

  Alt 8. Okt 2018, 22:40
Und wo ist das PIC das übergeben wird?
Wenn es nicht verarbeitet wird in dieser Funktion sondern über
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

Geändert von EWeiss ( 8. Okt 2018 um 22:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: JPEG Error

  Alt 8. Okt 2018, 22:44
Dann macht mans so
procedure GetScreenShot(var mybm: TBitmap); Gruß
K-H

P.s.
c&P at ist best
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: JPEG Error

  Alt 8. Okt 2018, 22:53
Dann macht mans so
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

Geändert von EWeiss ( 8. Okt 2018 um 23:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.119 Beiträge
 
Delphi 12 Athens
 
#7

AW: JPEG Error

  Alt 9. Okt 2018, 10:11
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Okt 2018 um 12:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: JPEG Error

  Alt 9. Okt 2018, 11:46
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: JPEG Error

  Alt 9. Okt 2018, 11:55
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
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#10

AW: JPEG Error

  Alt 9. Okt 2018, 13:02
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
Dann macht mans so
procedure GetScreenShot(var mybm: TBitmap);
also als 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 const von machen (was im Hinblick auf ARC auch noch einen Vorteil bringt).

Also procedure GetScreenShot(const mybm: TBitmap); .
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
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