|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|