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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2011, 14:23   #1
Horsee
 
Аватар для Horsee
 
Регистрация: 01.07.2011
Сообщений: 6
Вопрос Обьединение 2х PNG в 3й

Всем привет.
Возникла у меня проблема при обьеденении 2 TPNGObject's в 3й.
Я попробовал 3й присвоить из 1го, и на него нанести 2й.

Но прозрачность 2го не учитывается:


Подскажите способ обьединения alpha каналов, заранее спасибо!

Вот код:
Вложения
Тип файла: txt Unit1.txt (1.2 Кб, 120 просмотров)

Последний раз редактировалось Horsee; 11.07.2011 в 19:52.
Horsee вне форума Ответить с цитированием
Старый 11.07.2011, 23:55   #2
antonn
Пользователь
 
Регистрация: 17.05.2011
Сообщений: 24
По умолчанию

перевести в tbitmap и сливать уже их, попиксельно.
"примерный пример" - http://forum.sources.ru/index.php?sh...post&p=2888880 , только в нем накладывается изображение с альфой еще и с процентом прозрачности, вам нужно просто 100% выставлять. альфа пересчитывается
antonn вне форума Ответить с цитированием
Старый 12.07.2011, 06:41   #3
Horsee
 
Аватар для Horsee
 
Регистрация: 01.07.2011
Сообщений: 6
Сообщение

Цитата:
Сообщение от antonn Посмотреть сообщение
перевести в tbitmap и сливать уже их, попиксельно.
"примерный пример"...
Спасибо за пример, но в нем вообще не используется PNG
Я попытался найти переводы в BMP и обратно, результат не лучше:

код во вложении.

Подскажите просто как можно обратится к альфа каналу у PNGObject, а уж перебрать их я думаю не сложно!!!
Вложения
Тип файла: txt Blend through BMP.txt (3.8 Кб, 124 просмотров)
Horsee вне форума Ответить с цитированием
Старый 12.07.2011, 10:17   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

перевод png в bmp

Код:
var
  png: tpngimage;
  bmp: tbitmap;
begin
  png := tpngimage.create;
  bmp := tbitmap.create;

  png.loadfromfile('1.png');
  bmp.assign(png);

  if bmp.pixelformat <> pf32bit then
    bmp.pixelformat := pf32bit;

  // тут делаем склейку

  freeandnil(png);
  freeandnil(bmp);
end;
ZuBy вне форума Ответить с цитированием
Старый 12.07.2011, 10:35   #5
Horsee
 
Аватар для Horsee
 
Регистрация: 01.07.2011
Сообщений: 6
По умолчанию

Непонял сути алгоритма
  1. PNG загружается из файла.
  2. BMP копируется из PNG.
  3. и потом эти 2 изображения склеиваются.
Поправьте меня если я не прав.

Последний раз редактировалось Horsee; 12.07.2011 в 10:50.
Horsee вне форума Ответить с цитированием
Старый 12.07.2011, 12:33   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
var
  png: tpngimage;
  result: tbitmap;
begin
  png := tpngimage.create;
  result := tbitmap.create;

  png.loadfromfile('1.png');

  result.pixelformat := pf32bit;
  result.width := png.width;
  result.height := png.height;

  result.canvas.draw(0,0, png);

  png.loadfromfile('2.png');

  result.canvas.draw(0, 0, png)

  // выводим куда нить Result, например в TImage
  Image1.picture.assign(result);

  freeandnil(png);
  freeandnil(result);
end;
ZuBy вне форума Ответить с цитированием
Старый 12.07.2011, 13:29   #7
antonn
Пользователь
 
Регистрация: 17.05.2011
Сообщений: 24
По умолчанию

ZuBy, неверно, альфа потеряется

Horsee, png загружается в tbitmap, два tbitmap блитятся друг на друга, результирующий tbitmap сохраняется в файл png. Пример блита с пересчетом альфы я выше дал, пример конвертации png->bmp/bmp->png есть тут http://desksoft.ru/index.php?downloa...chments&id=254
antonn вне форума Ответить с цитированием
Старый 12.07.2011, 16:02   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Примерно так:

Код:
procedure BlendPNG(Layer1, Layer2: TPNGObject; var blendedPNG: TPNGObject; Threshold: byte);
var
  x, y: Integer;
  SL1, SL2, SLBlended: pRGBLine;
  aSL1, aSL2, aSLBlended: PByteArray;
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
      aSLBlended[x]  := ((aSL1[x] * (255 - threshold) + (aSL2[x] * threshold)) shr 8);
      SLBlended[x].rgbtRed   := ((SL1[x].rgbtRed   * (255 - threshold) + (SL2[x].rgbtRed   * threshold)) shr 8);
      SLBlended[x].rgbtGreen := ((SL1[x].rgbtGreen * (255 - threshold) + (SL2[x].rgbtGreen * threshold)) shr 8);
      SLBlended[x].rgbtBlue  := ((SL1[x].rgbtBlue  * (255 - threshold) + (SL2[x].rgbtBlue  * threshold)) shr 8);
    end;
  end;
end;

Цитата:
Function SplicingPNG(PNG1, PNG2 : TPNGObject) : TPNGObject;
Begin
Result := TPNGObject.Create;
...
Плохой стиль, приводящий к ошибкам. Если функции нужно вернуть объект, пусть просит создать его перед вызовом.
Вложения
Тип файла: zip BlendPNG.zip (372.2 Кб, 16 просмотров)
пыщь

Последний раз редактировалось JTG; 12.07.2011 в 16:09.
JTG вне форума Ответить с цитированием
Старый 12.07.2011, 16:55   #9
Horsee
 
Аватар для Horsee
 
Регистрация: 01.07.2011
Сообщений: 6
По умолчанию

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

Такой эффект можно получить если нанести через canvad.draw на форму 2е PNG, на одни координаты.
Но это банальный способ, хотелось бы все в оперативке сделать.
Horsee вне форума Ответить с цитированием
Старый 12.07.2011, 17:19   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Тогда так

Код:
procedure OverlapPNG(Layer1, Layer2: TPNGObject; var blendedPNG: TPNGObject);
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;
Не знаю правда насколько быстро работает и не вылезает ли где значение R/G/B/A за пределы 0..255
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьединение таблиц sear Помощь студентам 5 22.04.2011 18:55
Обьединение проектов в Delphi. arhiepiskop Общие вопросы Delphi 3 26.05.2010 16:32
обьединение много дисков в 1 KyPA Помощь студентам 1 13.05.2010 15:53
Обьединение данных Zhohov Microsoft Office Excel 2 11.07.2008 14:34