Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 263

/ вопрос решён /

Ув. экперты. У меня есть одна картинка, состоящая из какой-то палитры цвета, есть другая картинка, покрывающая первую со своей палитрой, мне нужно слить их в одну картинку, т.е. вручну нужно на каждому пикселю их объеднить с определенным коэфициентом прозрачности, но как? (Слышал есть какой-то blending метод...)

SMaks Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: SMaks (статус: 1-ый класс)
Вопрос отправлен: 13 января 2007, 12:12
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, SMaks!
Этот метод подразумевает, следующее. Опишу фунцией: :)
//c1,c2 - два цвета для смешивания.
//скоко взять первого цвета, от 0 до 1
function Smeshat(c1,c2:TColor; pr:float):TColor;
var b1,b2:byte;
r,g,b:byte;
begin
b1:=(c1 shr 16) and $FF;
b2:=(c2 shr 16) and $FF;
r:=round(b1*pr+b2*(1-pr));

b1:=(c1 shr 8) and $FF;
b2:=(c2 shr 8) and $FF;
g:=round(b1*pr+b2*(1-pr));

b1:=c1 and $FF;
b2:=c2 and $FF;
b:=round(b1*pr+b2*(1-pr));
result:=RGB(r,g,b);
end;
Теперь в двойном цикле пробегаем по пикселям и записываем а результирующий. Правда через Pixels[i,j] будет немного медлено, но для отладки самое оно. Потом можно перейти на ScanLine - скорость возрастёт на порядок.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 13 января 2007, 15:55
Оценка за ответ: 5

Комментарий к оценке: Что-то я неслышал ничего про ScanLine, а это собсвенно что?

Ответ #2. Отвечает эксперт: Denisss

Здравствуйте, SMaks!

Привожу свою функцию по слиянию двух изображений c учетом коэффициента прозрачности (от 0 до 255).
Если коэффициент прозрачности = 0, то на выходе первое изображение, если = 255, то второе.

Пример использования:

// Допустим, есть некие два изображения
// (c загруженными в них изображениями):
// Bmp1, Bmp2: TBitmap;
// есть визуальные компоненты
// Image1: Timage;
// TrackBar1: TTrackBar1;
// У последнего необходимо установить
// свойство Max = 255
// В событии OnChange компонента TrackBar1 пишем
// следующий код:

procedure TForm1.TrackBar1Change(Sender: TObject);
var
Bmp: TBitmap;
begin
Bmp:= dsBMPMerge(Bmp1, Bmp2, TrackBar1.Position);
Image1.Picture.Bitmap.Assign(Bmp);
FreeAndNil(Bmp);
end;

Вот и все. Все остальные комментарии см. в приложенном коде.

Удачи!

Приложение:
  1. function dsBMPMerge(aBMP1, aBMP2: TGraphic;
  2. const aTransp: Byte): TBitmap;
  3.  
  4.  
  5.  
  6.  
  7. //
  8.  
  9.  
  10.  
  11. type
  12.  
  13. TdsRGB = array[0..2] of Byte;
  14. PdsRGB = ^TdsRGB;
  15. var
  16.  
  17. fTr1, fTr2: Double;
  18.  
  19. fBmp1, fBmp2: TBitmap;
  20.  
  21. i, j, h, w: Integer;
  22. fRGB1, fRGB2: PdsRGB;
  23. begin
  24.  
  25. fTr1:= (255 - aTransp)/255;
  26.  
  27. fTr2:= aTransp/255;
  28.  
  29. fBmp1:= TBitmap.Create;
  30. fBmp2:= TBitmap.Create;
  31. try
  32.  
  33. fBmp1.Assign(aBMP1);
  34.  
  35.  
  36. fBmp1.PixelFormat:= pf24bit;
  37.  
  38. fBmp2.Assign(aBMP2);
  39.  
  40.  
  41. fBmp2.PixelFormat:= pf24bit;
  42.  
  43. h:= fBmp1.Height;
  44.  
  45.  
  46. w:= fBmp2.Width - 2;
  47.  
  48. for j:= 0 to Pred(h) do
  49. begin
  50.  
  51. fRGB1:= fBmp1.ScanLine[j];
  52.  
  53. fRGB2:= fBmp2.ScanLine[j];
  54.  
  55. for i:= 0 to w do
  56. begin
  57.  
  58.  
  59. fRGB1^[0]:= Round(fTr1 * fRGB1^[0] + fTr2 * fRGB2^[0]);
  60. fRGB1^[1]:= Round(fTr1 * fRGB1^[1] + fTr2 * fRGB2^[1]);
  61. fRGB1^[2]:= Round(fTr1 * fRGB1^[2] + fTr2 * fRGB2^[2]);
  62.  
  63. inc(fRGB1);
  64. inc(fRGB2);
  65. end;
  66.  
  67.  
  68. fRGB1^[0]:= Round(fTr1 * fRGB1^[0] + fTr2 * fRGB2^[0]);
  69. fRGB1^[1]:= Round(fTr1 * fRGB1^[1] + fTr2 * fRGB2^[1]);
  70. fRGB1^[2]:= Round(fTr1 * fRGB1^[2] + fTr2 * fRGB2^[2]);
  71. end;
  72. finally
  73.  
  74. Result:= fBmp1;
  75.  
  76. FreeAndNil(fBmp2);
  77. end;
  78. end;


Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 13 января 2007, 16:54
Оценка за ответ: 5

Комментарий к оценке: Спасибо.

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:24: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.