![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как изменить bmp файл
Андрей! © (2003-07-13 00:32:00)
Необходимо увеличить или уменьшить яркость изображения
Fenik (2003-07-14 20:45:00) [1]Млин, опять моя невнимательность.
Вот, http://delphibase.endimus.com/?action=viewfunc&topic=mediaimg&id=10449
wiz (2003-07-14 14:33:00) [2]
2 Андрей!
rgbtBlue := BLimit(round(rgbtBlue*k/30));
действительно должно работать, но при этом она смещает центр цветового баланса (т.е. действует не только как изменение контраста, но и изменение яркости)
wiz (2003-07-14 14:29:00) [3]
Во-первых, если в формулу
B := BLimit(CB + Trunc((B - CB) * vd));
подставить отрицательное vd, то получится бред, т.к. "B" будет действовать отрицательно на результирующее "B" и произойдет инверсия. (случай нулевого vd я думаю не имеет смысла рассматривать вообще => там результат известен заранее - CB)
На самом деле эта формула работать будет, если:
а) vd: single; (или другой вещ. тип)
б) vd от 0 до 1 уменьшает контраст
в) vd = 1 оставляет контраст неизменным
г) vd от 1 до 255 увеличивает контраст
Fenik (2003-07-13 22:11:00) [4]
> Я так попробовал но как то неправильно получилось.
Плохо пробовал.
Андрей! (2003-07-13 21:59:00) [5]Я так попробовал но как то неправильно получилось.
Я не знаю почему но так вот получилось вроде бы то что надо, только методом тыка пришёл к этому
rgbtBlue := BLimit(round(rgbtBlue*k/30));
rgbtGreen := BLimit(round(rgbtGreen*k/30));
rgbtRed ( round(rgbtRed*k/30)Я так попробовал но как то неправильно получилось.
Я не знаю почему но так вот получилось вроде бы то что надо, только методом тыка пришёл к этому
rgbtBlue := BLimit(round(rgbtBlue*k/30));
rgbtGreen := BLimit(round(rgbtGreen*k/30));
rgbtRed := BLimit(round(rgbtRed*k/30));
k - [10..90]
Fenik (2003-07-13 20:30:00) [6]
> CB = 127
> CG = 127
> CR = 127
Ну или 128..
Fenik (2003-07-13 20:23:00) [7]
vd - коэффициент контрасности от -255 до +255.
B := BLimit(CB + Trunc((B - CB) * vd));
G := BLimit(CG + Trunc((G - CG) * vd));
R := BLimit(CR + Trunc((R - CR) * vd));
Для "местного" контраста:
CB = 127
CG = 127
CR = 127
Для "общего": CR, CG, CB находятся как средние компоненты всех цветов изображения.
Андрей! (2003-07-13 19:27:00) [8]
С яркостью получилось, забыл Image обновить, но а как контраст в твоей проге зделать?!
по идее как по алгоритму необходимо цвет умножить на коэффицент, но так не катит?!
Fenik (2003-07-13 18:15:00) [9]
> Андрей!
Читай - Fenik © (13.07.03 17:23) может покатит..
Напиши как вызываешь процедуру.
----
17-21 = Fenik.
Андрей! (2003-07-13 17:31:00) [10]
что то прога от 17-21 не катит, а вот видео можно изменить??
Fenik (2003-07-13 17:23:00) [11]
Не забудь
Bitmap.PixelFormat := pf24Bit;
Fenik (2003-07-13 09:20:00) [12]
Ну вы поняли кто это - "17-21" -)
17-21 (2003-07-13 09:05:00) [13]procedure RGBColors(Bitmap: TBitmap; nr, ng, nb: Integer);
function BLimit(B: Integer): Byte;
begin
if B < 0 then Result := 0
else if B > 255 then Result := 255
else Result := B;
end;
var x, y: Integer;
Dest: pRGBTriple;
begin
for y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
with Dest^ do begin
rgbtBlue := BLimit(rgbtBlue + nb);
rgbtGreen := BLimit(rgbtGreen + ng);
rgbtRed := BLimit(rgbtRed + nr);
end;
Inc(Dest);
end;
end;
end;
Чтобы изменить яркость, нужно вызвать при ( Bmp, 30, 30, 30)procedure RGBColors(Bitmap: TBitmap; nr, ng, nb: Integer);
function BLimit(B: Integer): Byte;
begin
if B < 0 then Result := 0
else if B > 255 then Result := 255
else Result := B;
end;
var x, y: Integer;
Dest: pRGBTriple;
begin
for y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
with Dest^ do begin
rgbtBlue := BLimit(rgbtBlue + nb);
rgbtGreen := BLimit(rgbtGreen + ng);
rgbtRed := BLimit(rgbtRed + nr);
end;
Inc(Dest);
end;
end;
end;
Чтобы изменить яркость, нужно вызвать при nr = ng = nb
RGBColors(Bmp, 30, 30, 30) - увеличение яркости на 30
RGBColors(Bmp, -50, -50, -50) - уменьшение яркости на 50
При разных значениях будет меняться баланс RGB.
wiz (2003-07-13 02:18:00) [14]
А если по рабоче-крестьянски:
procedure contrast(param:integer; var r_in,g_in,b_in:integer);
begin
r_in:=round((r_in-128)/128*param+128);
if r_in<0 then r_in:=0;
if r_in>255 then r_in:=255;
g_in:=round((g_in-128)/128*param+128);
if g_in<0 then g_in:=0;
if g_in>255 then g_in:=255;
b_in:=round((b_in-128)/128*param+128);
if b_in<0 then b_in:=0;
if b_in>255 then b_in:=255;
end;
procedure brightness(param:integer; var r_in,g_in,b_in:integer);
begin
r_in:=r_in+param;
if r_in<0 then r_in:=0;
if r_in>255 then r_in:=255;
g_in:=g_in+param;
if g_in<0 then g_in:=0;
if g_in>255 then g_in:=255;
b_in:=b_in+param;
if b_in<0 then b_in:=0;
if b_in>255 then b_in:=255;
end;
По крайней мере несколько виденных мною управлялок цветом действуют по таким (или подобным) формулам. (contrast лучше вызвать до brightness).
r_in, g_in, b_in: компоненты цвета.
128 для contrast и 0 для brightness - неизменяющее (еденичное) преобразование.
Далее остаётся задача - как быстро передать bitmap в эти процедуры, но это уже классика.