2 Stimmen

Wie schreibt man eine Avi-Datei aus einer Folge von TBitmaps?

Ich habe eine Möglichkeit gefunden, avi aus BMP-Dateien zu schreiben:
http://www.delphi3000.com/articles/article_2770.asp?SK=
Ich möchte ein Avi aus einem Array oder einer TList von TBitmaps schreiben?

7voto

Rob Kennedy Punkte 158781

Der wichtigste Teil des Codes, den Sie verlinkt haben, befindet sich unten, wo IList ist eine TStrings mit den Namen aller Dateien, die in die Animation aufgenommen werden sollen.

for i := 0 to IList.Count - 1 do begin
  AssignFile(BFile, IList[i]);
  Reset(BFile, 1);
  Seek(BFile, m_bfh.bfOffBits);
  BlockRead(BFile, m_MemBits[0], m_Bih.biSizeImage);
  Seek(BFile, SizeOf(m_Bfh));
  BlockRead(BFile, m_MemBitMapInfo[0], length(m_MemBitMapInfo));
  CloseFile(BFile);
  if AVIStreamWrite(psCompressed, i, 1, @m_MemBits[0],
      m_Bih.biSizeImage, AVIIF_KEYFRAME, 0, 0) <> 0 then begin
    ShowMessage('Error during Write AVI File');
    break;
  end;
end;

Es liest Teile der Datei von der Festplatte und schreibt sie in den AVI-Stream. Der wichtige Teil ist, dass es von der Dateien . Die In-Memory-Darstellung einer TBitmap nicht unbedingt mit der Darstellung einer Datei übereinstimmt. Es ist jedoch einfach, den gegebenen Code anzupassen, um die Bitmaps vorübergehend in einem Speicherstrom zu speichern; der Strom wird dem Layout der Datei entsprechen. Angenommen, IList ist jetzt ein Array aus TBitmap wie Sie vorgeschlagen haben. Dann könnten wir dies verwenden:

var
  ms: TMemoryStream;

ms := TMemoryStream.Create;
try
  for i := 0 to Length(IList) - 1 do begin
    IList[i].SaveToStream(ms);
    ms.Position := m_bfh.bfOffBits;
    ms.ReadBuffer(m_MemBits[0], m_Bih.biSizeImage);
    ms.Position := SizeOf(m_Bfh);
    ms.ReadBuffer(m_MemBitMapInfo[0], Length(m_MemBitMapInfo));
    ms.Clear;
    if AVIStreamWrite(psCompressed, i, 1, @m_MemBits[0],
        m_Bih.biSizeImage, AVIIF_KEYFRAME, 0, 0) <> 0 then begin
      ShowMessage('Error during Write AVI File');
      break;
    end;
  end;
finally
  ms.Free;
end;

In dem von Ihnen zitierten Beispiel gibt es einen Code, der die erste Datei in der Liste liest, um die verschiedenen Datensätze aufzufüllen und die Größe der hier verwendeten Arrays zu bestimmen, aber Sie sollten in der Lage sein, dort die gleichen Änderungen vorzunehmen, die ich an dem hier gezeigten Code vorgenommen habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X