Перейти к содержанию
Fire Monkey от А до Я
  • 0

Наклеить одно изображение на другое


Rusland

Вопрос

Опубликовано (изменено)

Есть две картинки в формате png. Как на одну картинку наложить вторую, которая с прозрачностью (фактически там только рамка) и вывести в Image?

Изменено пользователем Rusland

Рекомендуемые сообщения

  • 0
  • Модераторы
Опубликовано
17 минут назад, Rusland сказал:

Есть две картинки в формате png. Как на одну картинку наложить вторую, которая с прозрачностью (фактически там только рамка) и вывести в Image?

приложи картинки

  • 0
Опубликовано (изменено)
1 час назад, krapotkin сказал:

ответ просто нарисовать по очереди не подошел?

Чей ответ? Как это сделать? Пока только ZuBy предложил использовать 2 Image. Но это не очень мне подходит.

Из найденного в интернете пока только для VCL (тут и тут ), а мне надо на FMX

 

Изменено пользователем Rusland
  • 0
Опубликовано

Безрезультатно убил полдня на поиски решения в интернете, пришлось разбираться самому:

var
  bmp: TBitmap;
  SrcRect, DstRect: TRectF;
begin
  bmp:=TBitmap.Create(200,260);
  bmp.Canvas.BeginScene();
  try
    SrcRect := TRectF.Create(0, 0, 200, 260);
    DstRect := TRectF.Create(0, 0, 200, 260);
    bmp.Canvas.DrawBitmap( Image1.Bitmap, SrcRect, DstRect, 1, false);
    bmp.Canvas.DrawBitmap( Image2.Bitmap, SrcRect, DstRect, 1, false);
  finally
    bmp.Canvas.EndScene();
  end;
  Image3.Bitmap.Assign(bmp);

"А ларчик просто открывался" 

 

PS. Осталось научится, как некоторые точки самому делать прозрачными

  • 0
Опубликовано

Тестировал вышеуказанный код c DrawBitmap на Windows и все отлично работает. Проверил на Android и, о ужас, на картинке в прозрачных местах возникают цветовые артефакты! Как исправить?

 

  • 0
Опубликовано

Вот проект Png2Png.zip - в Windows работает нормально.

В Android нажимаю кнопку - в первый раз бывает что два битмапа склеиваются нормально. Но чаще вижу артефакты:

Screenshot_2016-10-10-16-11-07.png

А если свернуть и развернуть приложение, то вот:

Screenshot_2016-10-10-16-11-30.png

 

Подскажите, что я делаю не правильно?

 

 

  • 1
  • Модераторы
Опубликовано
var
  bmp: TBitmap;
  SrcRect, DstRect, SrcRect2, DstRect2: TRectF;
begin
  bmp := TBitmap.Create(256, 256);
  bmp.Canvas.BeginScene();
  try
    SrcRect := TRectF.Create(0, 0, 256, 256);
    DstRect := TRectF.Create(20, 20, 236, 236);
    SrcRect2 := TRectF.Create(0, 0, 256, 256);
    DstRect2 := TRectF.Create(0, 0, 256, 256);
    bmp.Clear(TAlphaColorRec.Null);
    bmp.Canvas.DrawBitmap(Image1.Bitmap, SrcRect2, DstRect2, 0.8, false);
    bmp.Canvas.DrawBitmap(Image2.Bitmap, SrcRect, DstRect, 0.8, false);
  finally
    bmp.Canvas.EndScene();
    Image3.Bitmap.SetSize(256, 256);
    Image3.Bitmap.CopyFromBitmap(bmp);
    bmp.Free;
  end;
end;

 

  • 0
Опубликовано (изменено)

Если очень хочется работать попиксельно - то можно попиксельно свести два битмапа, вызывая getPixel одного и setPixel другого.

http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.Graphics.TBitmapData

Изменено пользователем sulion
  • 0
Опубликовано

Про 

bmp.Clear(TAlphaColorRec.Null)

надо не забывать. В Windows новая картинка создается уже заполненной нулями, хотя гарантий нет, а вот на других платформах — память содержит мусор, хотя гарантий тоже нет, поэтому вполне может работать на одном дэвайсе нормально, а на другом выдавать мусор.

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...