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?
Antwort
Zu viele Anzeigen?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.