• 0
Rusland

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

Вопросы

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 ответов на этот вопрос

  • 0
17 минут назад, Rusland сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Хотелось бы получить что-то вроде (легко делается с помощью Photoshop/GIMP и т.п.):

cardblank2.png

а нужно делать программно

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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
5 часов назад, Rusland сказал:

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

Отлично! Артефакты пропали. Если свернуть/развернуть приложение, ничего не исчезает :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Про 

bmp.Clear(TAlphaColorRec.Null)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Julia
      Загружаю через opendialog картинку  формата bmp в image
      Есть переменные с:TColor, c1:Tcolor
      Необходимо  вначале узнать цвет определенного пикселя на загруженной картинке и записать в  c1, а затем изменить цвет определенного пикселя на загруженной картинке на цвет, хранящийся в переменной c.
      Ищу очень давно, но внятного объяснения нигде не нашла(
       
       
    • От Макс Войтенко
      Хотел сделать вот так (1 скриншот)

      Выбраная вкладка (аккаунты): иконка красная. А остальные вкладки чтобы иконка была серая. (как шрифт ниже).
      Подскажите как решить?
    • От MrSergei2017
      Я тут новичок, и не понимаю как использовать комманду CopyFromBitmap
    • От ODmitrijS
      Подскажите алгоритм или готовый пример заливки замкнутой области рисунка произвольной формы определенным цветом?
      Моё решение часто приводит к переполнению стека.
    • От virus_forever
      Доброго времени суток!
      Подскажите, пожалуйста, как можно отрисовать Bitmap (схематично на рисунке представлен черным прямоугольником) с поворотом последнего на определенный угол (скажем 45, 90, или любой другой) относительно какой либо точки - например центра TBitMap`a. И потом определить координаты углов - A, B, C и D для дальнейшего использования.

      Я вычитал, что для этого используется TMatrix с ее методами и SetMatrix у Canvas. Но в матрицах можно сказать ничего не понимаю, и нету хорошего описания - что это и с чем это употребляют.
      Подскажите, пожалуйста! Заранее спасибо!
    • От Равиль Зарипов (ZuBy)
      Привет Всем!
      Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.
      я взял картинки пользователей этого форума

      Seattle LVdynamicLoadBitmap.zip
      Berlin LVdynamicLoadBitmap(Berlin).zip
    • От M1shQa
      Есть задача написать дату на полученной только что фотографии с камеры. С камеры фотку получаю и выгружаю в TImage, далее нашел пару способов, а именно:
      image.bitmap.canvas.textout
      image.bitmap.canvas.filltext
      и оба у меня не работают, первый вариант не удается запустить, пишет, что нету такого свойства textout у TCanvas, а второй тупо вешает программу. Подскажите как можно решить эту проблему пожалуйста.
    • От umkes
      Добрый день, возникла проблема при работе с TImage;
      У меня компонент TImage - imgRing и есть в TImageList. 
      Я динамически формирую Bitmap из копий картинки из TImageList и асайню его в TImage. На Windows все работает прекрасно, а на андроиде картинка все время пустая... Может кто-то подскажет, где я не прав
      //============================================================================== procedure TMainForm.DrawRing; //------------------------------------------------------------------------------ var bmp1, bmp2 : TBitmap; i : integer; str : TMemoryStream; begin bmp2 := TBitmap.Create; bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Items[0].Bitmap); bmp1 := TBitmap.Create; bmp1.Assign(bmp2); bmp1.Width := ClientWidth + bmp2.Width * 10; i := 0; bmp1.Canvas.BeginScene(); while (i * bmp2.Width) < bmp1.Width do begin bmp1.Canvas.DrawBitmap(bmp2, RectF(0, 0, bmp2.Width, bmp2.Height), RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height), 1 ); inc(i); end{ while }; bmp1.Canvas.EndScene; str := TMemoryStream.Create; bmp1.SaveToStream(str); str.Position := 0; imgRing.BeginUpdate; imgRing.Bitmap.CreateFromStream(str); imgRing.EndUpdate; end{ procedure TMainForm.DrawRings }; Делаю такое потому-что TImage.WrapMode.Tile не подходит для моей задачи.
    • От HoShiMin
      Загружаю в Bitmap значок 16х16, должно получиться что-то вроде такого:

      А получается так:

       
      Помогает только изменение размеров холста в фотошопе. В ХЕ8 всё работало как надо, в 10 - вот. Хотел отредактировать стиль, убрав Stretch у картинки, но у всплывающего меню нельзя отредактировать стиль. Как поправить, не меняя размеры самих картинок значков?
    • От alewka006
      Подскажите, как на форме сделать фоновое изображение. Вставляю картинку (TImage) на весь экран, изображение в пропорции выводится не на весь экран
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу