Объединить несколько изображений в FMX?

В VCL я делаю одно изображение из двух изображений, создавая пространство между ними:

 procedure TForm2.Button1Click(Sender: TObject);
var
p1,p2:string;
b1,b2:TBitmap;
bitmap: TBitmap;
begin
 p1:='C:\Users\John\Desktop\p1.bmp';
 p2:='C:\Users\John\Desktop\p2.bmp';
 b1:=TBitmap.Create;
 b1.LoadFromFile(p1);
 b2:=TBitmap.Create;
 b2.LoadFromFile(p2);
  sBit:= TBitmap.Create;
  try
   sBit.Height:=b1.Height;
   sBit.Width:=b1.Width+5+b2.Width;
   sBit.Canvas.Draw(0,0,b1); //Drawing First Bitamp here
   sBit.Canvas.Draw(b1.Width + 5,0,b2);// Drawing Second one 
   Image1.Picture.Bitmap.Assign(sBit);
  finally
   sBit.FreeImage;
  end;
end; 

Теперь, как я могу нарисовать то же самое в FMX?

ИЗМЕНИТЬ

Использование Bitmap.CopyFromBitmap работает!!

 procedure process;
 var
  p1,p2: String;
  b1,b2,b3:TBitmaps;
  rect: TRect;
  begin
  //load both bitmaps to b1 and b2.
  rect.Left:=0;
  rect.Top:=0;
  rect.Width:=b1.Width;
  rect.Height:=b1.Height; 
  b3:= TBitmaps.Create;
  b3.Height:= b1.height;
  b3.widht:=b1.width;
  b3.CopyFromBitmap(b1,rect,0,0);
  b3.CopyFromBitmap(b2,rect,b1r.Width+5,0);
  Image1.Bitmap.Assign(b3);
end; 

person John    schedule 16.05.2019    source источник
comment
Код в вашем редактировании не компилируется из-за проблем, решаемых @RemyLebeau . После исправлений он компилируется и работает как сказано.   -  person Tom Brunberg    schedule 16.05.2019
comment
@TomBrunberg Да, забыл установить Rects.   -  person John    schedule 16.05.2019


Ответы (1)


В VCL вы не можете загрузить изображение PNG в TBitmap, только изображение BMP. Вам придется использовать TPngImage вместо b1 и b2. TPngImage может быть Draw() на VCL TCanvas.

Однако TBitmap от FMX поддерживает PNG.

В FMX эквивалентом Canvas.Draw() в этой ситуации будет использование TBitmap.CopyFromBitmap()< /а>:

Копирует прямоугольную область из указанного растрового изображения в текущее растровое изображение.

А затем используйте Image1.Bitmap.Assign(sBit);, чтобы назначить окончательный TBitmap на TImage (в FMX нет TPicture).

person Remy Lebeau    schedule 16.05.2019
comment
я пробовал CopyFromBitmap, но это ничего не загружает в TImage, см. мой обновленный вопрос. - person John; 16.05.2019
comment
@John, вы не устанавливаете размеры места назначения TBitmap перед вызовом CopyFromBitmap(), как вы делаете это в VCL перед рисованием. Кроме того, вы объявили отдельный TRect для b2, но на самом деле вы его не используете. Ваш код VCL позволяет двум растровым изображениям иметь разную ширину, а ваш код FMX — нет. Также нет TBitmaps, вместо него должно быть TBitmap. Кроме того, вы не должны использовать GetCurrentDir(), CWD процесса является динамическим и не гарантирует, что вы ожидаете - person Remy Lebeau; 16.05.2019
comment
Да Забыл установить Rects. использовал один и тот же прямоугольник (br1), так как оба изображения имеют одинаковые монеты. это TBitmaps, потому что IDE не может разрешать имена модулей, добавляя FMX.Graphic.TBitmap или FMX.Graphic.Bitmap в предложение использования. и я не получил последнюю часть вашего комментария о GetCurrentDir сэр, извините. - person John; 16.05.2019
comment
@Джон нет класса TBitmaps. Если ваша IDE не может разрешить TBitmap, вам нужно исправить свой проект. Правильное имя юнита для включения в предложение usesFMX.Graphics. - person Remy Lebeau; 16.05.2019
comment
Он уже есть FMX.Graphics, но не понимаете, почему он не может разрешить TBitmap модуль. - person John; 16.05.2019