Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите как изменить 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 в эти процедуры, но это уже классика.


Наверх

Титульная страница Поиск, карта сайта Написать письмо