Einzelnen Beitrag anzeigen

Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 28. Mär 2009, 16:48
Zitat von _frank_:
probiers mal so (von hier):

Delphi-Quellcode:
const
  CAPTUREBLT = $40000000;

DC := GetWindowDC(0);
try
  BitBlt(BackBuf.Canvas.Handle, 0, 0, BackBuf.Width, BackBuf.Height, DC, 0, 0, SRCCOPY or CAPTUREBLT);
finally
  ReleaseDC(0, DC);
end;
//Edit:
das mit dem Wasserzeichen versteh ich nicht ganz...wozu brauchst du da alphablending? warum nicht einfach die normalen Canvas-Methoden, um Text/Rahmen hinzumalen?

HTH Frank
Hallo,

also ich bin ein wenig am Verzweifeln, und zwar versuche ich mithilfe dieses codes eine art kurzen "motion grabber" zu schreiben. Ich bekomme es aber nicht sauber hin... wenn ich alles in eine procedur packe, dann kommt nach ca. 70 ganzbildjpgs (~á400kb) irgendwas mit "Für diesen Befehl ist nicht genügend Speicher vorhanden".
Das kann aber eigentlich nicht sein... denn wenn ich bilder von der platte lade (habsch getestet) dann kann ich 4500 (~á400kb) problemlos laden, bis es dann zu stottern anfängt und irgendwann die fehlermeldung "Nicht genügend Arbeitsspeicher" kommt.
(wer jetzt die stirn runzelt sei einigermaßen beruhigt: ziel ist es ca. 3600 bilder à 100-200kb aneinanderzureihen sollte also rechnerisch gehen)

versucht hatte ich es bisher mit einem array:
jpglisted: array of TJpegimage; dann wollte ich das ganze durch eine schleife rennen lassen die ungefähr folgendes macht:

Delphi-Quellcode:
procedure TForm1.newscreenshot(sender:TObject);
var
  screenshotjpg: TJpegimage;
  DC:HDC;
  screenshot: TBitmap;
  i:integer;
const
  CAPTUREBLT = $40000000;
begin
DC := GetWindowDC(0);
try
  screenshot := TBitmap.Create;
  screenshot.Width := form2.Shape1.Width;
  screenshot.Height:= form2.Shape1.height;
  screenshot.PixelFormat := pfDevice;
finally
        BitBlt(screenshot.Canvas.Handle, 0, 0, screenshot.Width, screenshot.Height, DC,(form2.Left+form2.Shape1.left),
        (form2.Top+form2.shape1.top), SRCCOPY or CAPTUREBLT);
        releaseDC(0,DC);

         jpglisted[geschafft] := Tjpegimage.Create;
        try
         jpglisted[geschafft].assign(screenshot);
        finally
          screenshot.Free;
          screenshot:=nil; //spätestens ab hier sollte doch nur noch das jpg im speicher sein...
        end;
    end;
ich hab zwischendrin auch mal versucht der datenflut über tmemorystream oder tfilestream herr zu werden aber beide prozesse brauchen pro jpgbild ~200ms was zu langsam ist.

ich vermute mal das ich das jpglisted[geschafft] noch .freeen müsste und das bild vorher (sauber getrennt) woanders hin übergeben müsste... aber ich weiss net wie das geht

arrays, streams, und all das ist neuland für mich, ich bin Anfänger
Deshalb würde ich mich über anfängerfreundliche Antworten freuen, vielleicht hat ja auch jemand lust mir den Mentor via MSN zu machen das wär schon klasse mal zwischendrin jemand fragen können mit Ahnung.

lieben Gruß

//EDIT:

was mir beim testen eben aufgefallen ist, wenn ich die bilder einzeln einer Tjpegliste hinzufüge wächst mein Programm im Taskmanager überhaupt nicht.... es bleibt bei 3822 byte obwohl ich 50 bilder hinzufüge... (bei 75 steigt er dann wieder aus und behauptet keinen speicher mehr für den befehl zu haben) kann es sein das er die bilder nicht im arbeitsspeicher sondern in irgendeinem viel kleineren puffer abzulegen versucht??? Wenn ich bilder (mit dem gleichen programm) von platte (in die gleiche liste) lade wird brav bei jedem neu geladenen bild auch das projekt im taskmanager größer....

// EDIT2...

ok, nachdem ich jetzt noch mehr rumprobiert und ausprobiert habe bin ich mir fast sicher: die von mir erzeugten bilder liegen in irgendeinem resourcenpuffer und solange ich sie nicht
1.) rausschreibe
2.) freigebe
3.) wieder reinlade
lassen sie sich auch durch nichts in meiner macht stehende dazu bringen in die gewaltigen hallen meines arbeitsspeichers zu hüpfen, sondern blockieren lieber weiter die engen flure...

jetzt hab ich zwar ne lösung (savetofile -> free -> loadfromfile) aber das ist doch krank und dauert fast ne halbe sekunde pro bild... gibts keinen befehl der Delphi zwingt ein bmp aus dem device context in den arbeitsspeicher zu schieben um den DC dann sauber deleten zu können?

über anfängerfreundliche antworten würde ich mich wie immer sehr freuen.
  Mit Zitat antworten Zitat