Я решил проблему записи массива TBitmap в файл и его повторного чтения.

 

Идея заключается в загрузке каждого TBitmap во временный TMemoryStream. Член TMemoryStream.Size информирует о размере данных, которые нужно сохранить на диске. Затем мы пишем размер и сопровождаем его данными типа TFileStream. Эту манипуляцию мы проделываем для каждого TBitmap в массиве.

 

Для процедуры чтения сначала мы должны считать из потока размер данных TBitmap. Затем мы распределяем область для типа TMemoryStream полученного размера и считываем данные. Затем переписываем из TFileStream в TMemoryStream. И, наконец, мы читает из TMemoryStream сам TBitmap. Эту манипуляцию мы проделываем для каждого TBitmap в массиве.

 

Ниже я привел код, который я реально использовал. Код из игры Bingo, которую я разрабатываю, имеет сетку 5x5, чьи ячейки содержат изображение.

 

 

Реализация алгоритма весьма медленна, поэтому если вы имеете или найдете более быстрый алгоритм, пожалуйста, уведомите меня об этом. Если у вас есть любые вопросы, пожалуйста, свяжитесь со мной.

 

Code:

procedure TMainForm.SaveBoard;

var

MemoryStream: TMemoryStream;

FileStream: TFileStream;

Writer: TWriter;

Buffer: Pointer;

Size: Longint;

Column: Integer;

Row: Integer;

begin

MemoryStream := TMemoryStream.Create;

FileStream := TFileStream.Create(SaveFilename, fmCreate);

Writer := TWriter.Create(FileStream, $1000);

try

for Column := 0to4do

for Row := 0to4do

begin

MemoryStream.Clear;

Bitmaps[Column, Row].SaveToStream(MemoryStream);

Buffer := MemoryStream.Memory;

Size := MemoryStream.Size;

Writer.WriteInteger(Size);

Writer.Write(Buffer^, Size);

end;

finally

Writer.Free;

FileStream.Free;

MemoryStream.Free;

end;

end;

 

procedure TMainForm.Open1Click(Sender: TObject);

var

MemoryStream: TMemoryStream;

FileStream: TFileStream;

Buffer: Pointer;

Reader: TReader;

Column: Integer;

Row: Integer;

Size: Longint;

begin

OpenDialog2.Filename := SaveFilename;

ifnot OpenDialog2.Execute then

Exit;

MemoryStream := TMemoryStream.Create;

FileStream := TFileStream.Create(OpenDialog2.Filename, fmOpenRead);

Reader := TReader.Create(FileStream, $1000);

try

for Column := 0to4do

for Row := 0to4do

begin

Size := Reader.ReadInteger;

MemoryStream.SetSize(Size);

Buffer := MemoryStream.Memory;

Reader.Read(Buffer^, Size);

Bitmaps[Column, Row].LoadFromStream(MemoryStream);

end;

finally

Reader.Free;

FileStream.Free;

MemoryStream.Free;

end;

DrawGrid1.Repaint;

SaveFilename := OpenDialog2.Filename;

Caption := 'Bingo-создатель - ' + ExtractFilename(SaveFilename);

end;

 

https://delphiworld.narod.ru/

DelphiWorld 6.0

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить