Сохранение рисунков из канваса TPaintBox в файл в приложениях Delphi на FireMonkey для Android
Вопрос, с которым сталкиваются разработчики, использующие Delphi 10.3.3 Firemonkey для создания приложений под Android, заключается в необходимости сохранения содержимого канваса TPaintBox в формате bitmap и, далее, в файл. Приложение рисует множество объектов в канвасе TPaintBox в событии OnPaint, и требуется сохранить всю эту информацию для дальнейшего использования.
Решение проблемы
Для решения этой задачи необходимо перенести логику рисования в функцию, которая может принимать в качестве аргумента канвас любого типа. Таким образом, можно использовать одну и ту же функцию для рисования в канвасе TPaintBox и для сохранения в TBitmap.
Пример кода
procedure GameCanvasPaint(Canvas: TCanvas);
begin
// Здесь размещаем код для рисования
end;
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
begin
GameCanvasPaint(Canvas);
end;
procedure TForm1.ShowShareSheetAction1BeforeExecute(Sender: TObject);
var
g_bmp_share: TBitmap;
begin
// g_bmp_share уже должен быть создан ранее
g_bmp_share.SetSize(Paintbox1.Width, Paintbox1.Height);
if g_bmp_share.Canvas.BeginScene then
try
g_bmp_share.Canvas.Clear($FFFFFF);
GameCanvasPaint(g_bmp_share.Canvas);
finally
g_bmp_share.Canvas.EndScene;
end;
ShowShareSheetAction1.Bitmap.Assign(g_bmp_share);
// Дополнительно, для сохранения в файл, можно использовать следующий код
var
SaveDialog: TFMSaveDialog;
Stream: TMemoryStream;
begin
SaveDialog := TFMSaveDialog.Create(nil);
try
SaveDialog.InitialFileName := 'image.bmp';
SaveDialog.Filter := 'Bitmap files (*.bmp)|*.bmp';
if SaveDialog.Execute then
begin
Stream := TMemoryStream.Create;
try
g_bmp_share.SaveToStream(Stream);
Stream.SaveToFile(SaveDialog.FileName);
finally
Stream.Free;
end;
end;
finally
SaveDialog.Free;
end;
end;
end;
Обратите внимание, что при рисовании на канвасе TBitmap в FMX необходимо вызвать метод Canvas.BeginScene перед началом рисования и Canvas.EndScene после завершения. Это требование важно для корректного отображения рисунка.
Альтернативный подход
Также стоит рассмотреть возможность рисования объектов не напрямую в канвасе TPaintBox, а в TBitmap как в оффскрин буффере. После чего рисунок можно перенести на канвас TPaintBox в событии OnPaint. Это может автоматически решить проблему сохранения изображения.
Заключение
Использование функции для рисования, которая может принимать различные канвасы, является ключом к решению задачи сохранения содержимого канваса TPaintBox в формате bitmap и последующего сохранения в файл. Не забудьте про вызов методов BeginScene и EndScene при работе с TBitmap в FMX.
Разработчики, использующие Delphi 10.3.3 Firemonkey для создания приложений под Android, сталкиваются с задачей сохранения рисунков из канваса TPaintBox в файл.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.