Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

Подскажите как изменить bmp файл   Найти похожие ветки 

 
Андрей!   (2003-07-13 00:32) [0]

Необходимо увеличить или уменьшить яркость изображения


 
wiz ©   (2003-07-13 02:18) [1]

А если по рабоче-крестьянски:


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


 
17-21   (2003-07-13 09:05) [2]

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.


 
Fenik ©   (2003-07-13 09:20) [3]

Ну вы поняли кто это - "17-21" -)


 
Fenik ©   (2003-07-13 17:23) [4]

Не забудь

Bitmap.PixelFormat := pf24Bit;


 
Андрей!   (2003-07-13 17:31) [5]

что то прога от 17-21 не катит, а вот видео можно изменить??


 
Fenik ©   (2003-07-13 18:15) [6]

> Андрей!
Читай - Fenik © (13.07.03 17:23) может покатит..

Напиши как вызываешь процедуру.

----
17-21 = Fenik.


 
Андрей!   (2003-07-13 19:27) [7]

С яркостью получилось, забыл Image обновить, но а как контраст в твоей проге зделать?!
по идее как по алгоритму необходимо цвет умножить на коэффицент, но так не катит?!


 
Fenik ©   (2003-07-13 20:23) [8]

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 находятся как средние компоненты всех цветов изображения.


 
Fenik ©   (2003-07-13 20:30) [9]

> CB = 127
> CG = 127
> CR = 127

Ну или 128..


 
Андрей!   (2003-07-13 21:59) [10]

Я так попробовал но как то неправильно получилось.

Я не знаю почему но так вот получилось вроде бы то что надо, только методом тыка пришёл к этому

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 22:11) [11]

> Я так попробовал но как то неправильно получилось.

Плохо пробовал.


 
wiz ©   (2003-07-14 14:29) [12]

Во-первых, если в формулу

B := BLimit(CB + Trunc((B - CB) * vd));

подставить отрицательное vd, то получится бред, т.к. "B" будет действовать отрицательно на результирующее "B" и произойдет инверсия. (случай нулевого vd я думаю не имеет смысла рассматривать вообще => там результат известен заранее - CB)

На самом деле эта формула работать будет, если:
а) vd: single; (или другой вещ. тип)
б) vd от 0 до 1 уменьшает контраст
в) vd = 1 оставляет контраст неизменным
г) vd от 1 до 255 увеличивает контраст



 
wiz ©   (2003-07-14 14:33) [13]

2 Андрей!

rgbtBlue := BLimit(round(rgbtBlue*k/30));

действительно должно работать, но при этом она смещает центр цветового баланса (т.е. действует не только как изменение контраста, но и изменение яркости)


 
Fenik ©   (2003-07-14 20:45) [14]

Млин, опять моя невнимательность.
Вот, http://delphibase.endimus.com/?action=viewfunc&topic=mediaimg&id=10449



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
9-40756
_0$a_
2003-05-06 22:51
2003.11.13
Народ помогите не кидайте в ИГНОР


1-41605
LastLamer
2003-10-26 23:00
2003.11.13
перехват изменения свойства объекта


14-41938
WWW
2003-10-20 16:43
2003.11.13
:)


3-40912
denick
2003-10-20 10:48
2003.11.13
Мастера, помогите пожалуйста.


4-42258
greg
2003-09-13 20:13
2003.11.13
Установка связи