Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2013, 17:29   #1
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию Наложить png на png

Подскажите пожалуйста ка наложить png на png и вывести в image
Gudzik11 вне форума Ответить с цитированием
Старый 17.12.2013, 17:35   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Приводитшь их к формату bmp, затем в bmp1.Draw(<координаты>,bmp2).
Человек_Борща вне форума Ответить с цитированием
Старый 24.12.2013, 09:52   #3
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Подскажите как в FireMonkey закрасить image каким то цветом но так чтоб этот цвет был полу прозрачный
Gudzik11 вне форума Ответить с цитированием
Старый 26.12.2013, 20:30   #4
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Вопрос приблизительно такой же. Имеется 2 изображения, которые нужно наложить друг на друга с сохранением альфаканала. Выводить ни куда не нужно. В интернете есть несколько процедур, делающих такое, но конкретно с этими двумя картинками не получается. Как я понял, в одной png нет альфаканала, из за чего процедуры "падают". Нужно какое-то глобальное решение, позволяющее клеить любые png. Проблемные картинки, как пример, в аттаче. Помогите пожалуйста найти, и исправить проблему.

Один из вариантов склейки.
Код:
procedure OverlapPNG(Layer1, Layer2: TPNGImage; var blendedPNG: TPNGImage);
var
  x, y: Integer;
  SL1, SL2, SLBlended: pRGBLine;
  aSL1, aSL2, aSLBlended: PByteArray;
  blendCoeff: single;
begin
  blendedPNG.Assign(Layer1);
  for y := 0 to Layer1.Height-1 do
  begin
    SL1 := Layer1.Scanline[y];
    SL2 := Layer2.Scanline[y];
    aSL1 := Layer1.AlphaScanline[y];
    aSL2 := Layer2.AlphaScanline[y];
    SLBlended := blendedPNG.Scanline[y];
    aSLBlended := blendedPNG.AlphaScanline[y];
    for x := 0 to Layer1.Width-1 do
    begin
      blendCoeff:=aSL1[x] * 100/255/100;
      aSLBlended[x] := round(aSL2[x] + (aSL1[x]-aSL2[x]) * blendCoeff);
      SLBlended[x].rgbtRed   := round(SL2[x].rgbtRed + (SL1[x].rgbtRed-SL2[x].rgbtRed) * blendCoeff);
      SLBlended[x].rgbtGreen := round(SL2[x].rgbtGreen + (SL1[x].rgbtGreen-SL2[x].rgbtGreen) * blendCoeff);
      SLBlended[x].rgbtBlue  := round(SL2[x].rgbtBlue + (SL1[x].rgbtBlue-SL2[x].rgbtBlue) * blendCoeff);
    end;
  end;
end;
Вложения
Тип файла: rar png.rar (22.1 Кб, 28 просмотров)
doktor255 вне форума Ответить с цитированием
Старый 26.12.2013, 21:12   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Ну добавьте альфу. Емнип:
Код:
Layer2.CreateAlpha();
офф. Это всё над тем же клиентом игрушки работаете ? Тогда ушли с темы и молчок.
phomm вне форума Ответить с цитированием
Старый 26.12.2013, 21:59   #6
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Ну добавьте альфу.
Пробовал ещё до того, как написал пост. Не вышло. К тому же как я уже написал, нужно универсальное решение, которое будет работать с любыми типами png не зависимо от того, есть в png alpha, или её нету.

Цитата:
Сообщение от phomm Посмотреть сообщение
Тогда ушли с темы и молчок.
Я отслеживал тему несколько дней, ответов не было. Решил что больше их и не будет.

Последний раз редактировалось doktor255; 26.12.2013 в 22:03.
doktor255 вне форума Ответить с цитированием
Старый 26.12.2013, 23:01   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Так, а что значит "процедуры падают" ?
Обычный draw устроил ?надо именно со сканлайнами и альфой колдовать ?

Завтра соберу из этой функции тестовое приложение, погоняю, а то даже не понимаю в чём трабл.

Там не было ответов, потому что, емнип, в имеющемся коде никто не хотел копаться, а предложенные методы были отринуты...
phomm вне форума Ответить с цитированием
Старый 26.12.2013, 23:24   #8
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Объясню задачу ещё раз. Имеем 2 изображения на HDD с неизвестными характеристиками Alpha. Задача - написать универсальную процедуру.

procedure BlendPNG(Layer1, Leyer2: TPngImage; X,Y: integer);
где:
Layer1 - png картинка на которую нужно "наклеить" вторую картинку
Layer2 - вторая png картинка, которая наклеивается на первую
X, Y - координаты склейки. Нужны для того, чтоб я мог двигать верхний слой относительно нижнего слоя;

Метод реализации не имеет значения. Главное чтоб метод был максимально оптимизирован, так как подобная операция проделывается до 50 раз единовременно.

Выше я дал 2 png картинки, одна из которых не имеет alpha. Процедура слейки должна уметь склеивать как такие картинки, так и картинки с альфой, либо картинки без алфы. То есть любые варианты png. А если процедура будет расширять холст в случае выхождения наклеиваемого слоя за границы подложки, то будет вообще идеально.

Последний раз редактировалось doktor255; 26.12.2013 в 23:49.
doktor255 вне форума Ответить с цитированием
Старый 27.12.2013, 06:58   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Тогда примеры всех пар картинок в студию, а то только по одной паре не тру, я не смогу гарантировать что алгоритм будет универсальный, т.к. не знаю, даже если найду у себя картинку чтобы проверить (а этого мне делать не хочется, программирование != тестирование), то она может не быть из того случая, что нужен Вам.

Про склейку и расширение холста ещё в той теме было сказано. Повторяю, это рассчитывается просто и легко аналитически.
холст.сет_сайз(макс(к1.ширина, х+к2.ширина), макс(к1.высота, х+к2.высота))

Сейчас проверю Вашу функцию на данных картинках погляжу что за косяк и попробую добиться норм работы. Хотя тут не вопрос программирования скорее, а дебага.
phomm вне форума Ответить с цитированием
Старый 27.12.2013, 09:55   #10
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Тогда примеры всех пар картинок в студию
Все варианты можно получить комбинируя те две картинки что я дал следующим образом.
1:1
1:2
2:2
Этого вполне достаточно.
doktor255 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PNG nXs Мультимедиа в Delphi 2 31.10.2010 12:53
PNG _-Re@l-_ Общие вопросы Delphi 8 15.07.2010 16:48
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38
*.png Killbrum Помощь студентам 3 30.08.2008 15:51
Png Witaliy Мультимедиа в Delphi 3 25.05.2008 23:10