// Es werden mehrere JPGs in einem Stream zusammengefasst und einzeln
// wieder herausgeholt. Wer es komfortabler haben will
(z.B. auflisten
// welche Dateien im Stream sind; einzelne Dateien aus dem Stream löschen usw.)
// schaue auf
mehrere Dateien in einer zusammenfassen


// Getestet mit D4 unter XP

uses JPeg;

var 
  Datei: string = 'C:\JPGs.str'; 
  MS, hlp: TMemoryStream; 
  JP: TJpegImage; 
 
procedure JPGStream(Bilder: array of string); 
var 
  i, x: integer; 
  procedure schreibe(s: string); 
  begin 
    JP.loadfromfile(s); 
    JP.SaveToStream(hlp); 
    i := hlp.size; 
    hlp.position := 0; 
    MS.writebuffer(i, 4); 
    MS.copyfrom(hlp, i); 
    hlp.size := 0; 
  end; 
begin 
  MS := TMemoryStream.create; 
  hlp := TMemoryStream.create; 
  JP := TJPegImage.create; 
  for x := 0 to high(Bilder) do 
    schreibe(Bilder[x]); 
  MS.SaveToFile(datei); 
  hlp.free; 
  MS.free; 
end; 
 
 
function HoleBild(welches: integer; JP: TJpegImage): boolean; 
var 
  i, w: integer; 
begin 
  result := false; 
  hlp := TMemoryStream.create; 
  try 
    MS.position := 0; 
    w := 0; 
    while MS.position < MS.Size do begin 
      MS.Readbuffer(i, 4); 
      if w = welches then begin 
        hlp.copyfrom(MS, i); 
        hlp.position := 0; 
        JP.loadfromstream(hlp); 
        result := true; 
        break; 
      end; 
      inc(w); 
      MS.Position := MS.Position + i; 
    end; 
  finally 
    hlp.free; 
  end; 
end; 
 
 
// --- Beispielaufrufe --- 
 
// 3 JPGs in einem Stream zusammenfassen 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  JPGStream(['D:\BILDER\JPG\Bild1.jpg', 'D:\BILDER\JPG\Bild2.jpg', 
    'D:\BILDER\JPG\Bild3.jpg']); 
end; 
 
 
// JPGs in unterschiedlicher Reihenfolge holen 
// und unterschiedlich lange anzeigen. 
// (Die Zählung der Bilder beginnt bei "Null") 
 
procedure TForm1.Button2Click(Sender: TObject); 
const 
  folge: array[0..2] of integer = (2, 0, 1); 
  pause: array[0..2] of integer = (2000, 1111, 1600); 
var 
  i: integer; 
begin 
  if fileexists(Datei) then begin 
    MS := TMemoryStream.create; 
    JP := TJPegImage.create; 
    try 
      MS.loadfromfile(Datei); 
      for i := 0 to 2 do begin 
        if HoleBild(folge[i], JP) then begin 
          canvas.draw(0, 0, JP);  // z.B. 
          sleep(pause[i]); 
          refresh; 
        end else begin 
          showmessage('Fehler bei Bild ' + inttostr(folge[i])); 
          break; 
        end; 
      end; 
    finally 
      JP.free; 
      MS.free; 
    end; 
  end else showmessage('Datei nicht gefunden'); 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke