| 
| 
 | Вопрос # 263/ вопрос решён / | 
 |  Ув. экперты. У меня есть одна картинка, состоящая из какой-то палитры цвета, есть другая картинка, покрывающая первую со своей палитрой, мне нужно слить их в одну картинку, т.е. вручну нужно на каждому пикселю их объеднить с определенным коэфициентом прозрачности, но как? (Слышал есть какой-то blending метод...) 
|  |   Вопрос задал: 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;
 
 Вот и все. Все остальные комментарии см. в приложенном коде.
 
 Удачи!
 Приложение:Переключить в обычный режим function dsBMPMerge(aBMP1, aBMP2: TGraphic;  const aTransp: Byte): TBitmap;    //   type   TdsRGB = array[0..2] of Byte;  PdsRGB = ^TdsRGB;var   fTr1, fTr2: Double;   fBmp1, fBmp2: TBitmap;   i, j, h, w: Integer;  fRGB1, fRGB2: PdsRGB;begin   fTr1:= (255 - aTransp)/255;   fTr2:= aTransp/255;   fBmp1:= TBitmap.Create;  fBmp2:= TBitmap.Create;  try     fBmp1.Assign(aBMP1);      fBmp1.PixelFormat:= pf24bit;     fBmp2.Assign(aBMP2);      fBmp2.PixelFormat:= pf24bit;     h:= fBmp1.Height;      w:= fBmp2.Width - 2;     for j:= 0 to Pred(h) do    begin       fRGB1:= fBmp1.ScanLine[j];       fRGB2:= fBmp2.ScanLine[j];       for i:= 0 to w do      begin          fRGB1^[0]:= Round(fTr1 * fRGB1^[0] + fTr2 * fRGB2^[0]);        fRGB1^[1]:= Round(fTr1 * fRGB1^[1] + fTr2 * fRGB2^[1]);        fRGB1^[2]:= Round(fTr1 * fRGB1^[2] + fTr2 * fRGB2^[2]);         inc(fRGB1);        inc(fRGB2);      end;        fRGB1^[0]:= Round(fTr1 * fRGB1^[0] + fTr2 * fRGB2^[0]);      fRGB1^[1]:= Round(fTr1 * fRGB1^[1] + fTr2 * fRGB2^[1]);      fRGB1^[2]:= Round(fTr1 * fRGB1^[2] + fTr2 * fRGB2^[2]);    end;  finally     Result:= fBmp1;     FreeAndNil(fBmp2);  end;end;
|  | Ответ отправил: Denisss (статус: 2-ой класс)Время отправки: 13 января 2007, 16:54
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо. |  
 Мини-форум вопросаВсего сообщений: 0. 31 января 2011, 19:24: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |