Идея заключается в загрузке каждого TBitmap во временный TMemoryStream. Член TMemoryStream.Size информирует о размере данных, которые нужно сохранить на диске. Затем мы пишем размер и сопровождаем его данными типа TFileStream. Эту манипуляцию мы проделываем для каждого TBitmap в массиве.
Для процедуры чтения сначала мы должны считать из потока размер данных TBitmap. Затем мы распределяем область для типа TMemoryStream полученного размера и считываем данные. Затем переписываем из TFileStream в TMemoryStream. И, наконец, мы читает из TMemoryStream сам TBitmap. Эту манипуляцию мы проделываем для каждого TBitmap в массиве.
Ниже я привел код, который я реально использовал. Код из игры Bingo, которую я разрабатываю, имеет сетку 5x5, чьи ячейки содержат изображение.
Реализация алгоритма весьма медленна, поэтому если вы имеете или найдете более быстрый алгоритм, пожалуйста, уведомите меня об этом. Если у вас есть любые вопросы, пожалуйста, свяжитесь со мной.
procedure TMainForm.SaveBoard;varMemoryStream: TMemoryStream;FileStream : TFileStream;Writer : TWriter;Buffer : Pointer;Size : Longint;Column : Integer;Row : Integer;beginMemoryStream := TMemoryStream.Create;FileStream := TFileStream.Create (SaveFilename, fmCreate);Writer := TWriter.Create (FileStream, $1000);tryfor Column := 0 to 4 do for Row := 0 to 4 dobeginMemoryStream.Clear;Bitmaps[Column, Row].SaveToStream (MemoryStream);Buffer := MemoryStream.Memory;Size := MemoryStream.Size;Writer.WriteInteger (Size);Writer.Write (Buffer^, Size);end;finallyWriter.Free;FileStream.Free;MemoryStream.Free;end;end; procedure TMainForm.Open1Click(Sender: TObject);varMemoryStream: TMemoryStream;FileStream : TFileStream;Buffer : Pointer;Reader : TReader;Column : Integer;Row : Integer;Size : Longint;beginOpenDialog2.Filename := SaveFilename;if not OpenDialog2.Execute then Exit;MemoryStream := TMemoryStream.Create;FileStream := TFileStream.Create (OpenDialog2.Filename, fmOpenRead);Reader := TReader.Create (FileStream, $1000);tryfor Column := 0 to 4 do for Row := 0 to 4 dobeginSize := Reader.ReadInteger;MemoryStream.SetSize (Size);Buffer := MemoryStream.Memory;Reader.Read (Buffer^, Size);Bitmaps[Column, Row].LoadFromStream (MemoryStream);end;finallyReader.Free;FileStream.Free;MemoryStream.Free;end;DrawGrid1.Repaint;SaveFilename := OpenDialog2.Filename;Caption := 'Bingo-создатель - ' + ExtractFilename (SaveFilename);end; |
Опубликовал Michael Vincze (102224.3340.compuserve.com) [000828]