Вопрос, поднятый пользователем Даниэлем, касается проблемы сохранения изображений с трансформациями в приложении для рисования, разработанном на RAD Studio XE2 с использованием Firemonkey. Приложение позволяет пользователям перетаскивать изображения на холст, а затем изменять масштаб и угол поворота изображений перед их сохранением. Однако, при сохранении изображений, трансформации, примененные к изображениям на холсте, не учитывались и терялись.
Описание проблемы
В коде программы используется простой алгоритм для отображения изображений на холсте, где каждый элемент списка изображений DroppedList перерисовывается на холсте FImage.Bitmap. Однако, трансформации (масштабирование и поворот), примененные к изображениям, не сохранялись и не отображались в сохраненном файле.
for i := 0 to DroppedList.Count - 1 do
begin
AImage := DroppedList[i];
// ... (инициализация прямоугольников)
with FImage.Bitmap do
begin
Canvas.BeginScene;
Canvas.DrawBitmap(AImage.Bitmap, SourceRect, TargetRect, 1, True);
Canvas.EndScene;
BitmapChanged;
end;
end;
FImage.Bitmap.SaveToFile('test.bmp');
Подтвержденное решение
Проблема заключалась в том, что трансформации применялись не к битмапу, а к элементу управления TImage, который отображает битмап. Для решения этой проблемы необходимо применить трансформации непосредственно к битмапу в цикле, согласно настройкам исходного TImage.
Вот пример кода, который решает проблему:
with FImage.Bitmap do
begin
Canvas.BeginScene;
LBmp := TBitmap.Create;
try
// Создаем копию битмапа, к которой будут применяться трансформации
LBmp.Assign(AImage.Bitmap);
// Поворот копии битмапа согласно углу поворота исходного TImage
if AImage.RotationAngle <> 0 then
LBmp.Rotate(AImage.RotationAngle);
// Масштабирование копии битмапа...
// ... (здесь может потребоваться дополнительный код для масштабирования)
Canvas.DrawBitmap(LBmp, SourceRect, TargetRect, 1, True);
finally
LBmp.Free;
Canvas.EndScene;
BitmapChanged;
end;
end;
Также было предложено использовать метод MakeScreenshot класса TControl, который может быть альтернативным способом получения битмапа с учетом трансформаций:
with FImage.Bitmap do
begin
Canvas.BeginScene;
LBmpInclTranformations := AImage.MakeScreenShot;
Canvas.DrawBitmap(LBmpInclTranformations, SourceRect, TargetRect, 1, True);
Canvas.EndScene;
BitmapChanged;
end;
Альтернативный ответ
Помимо предложенных решений, можно использовать масштабирование целевого прямоугольника TargetRect, чтобы учесть масштабирование изображения:
Пользователь Даниэль подтвердил, что предложенное решение работает корректно. Важно помнить, что трансформации должны применяться непосредственно к битмапу, и не забывать о масштабировании целевого прямоугольника, если это необходимо.
В данной статье мы рассмотрели проблему сохранения изображений с трансформациями в приложении для рисования на Delphi, а также предложили и объяснили решения, которые помогут разработчикам исправить данную ошибку.
Проблема в приложении для рисования на Delphi связана с потерей трансформаций изображений при их сохранении.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS