Форум: "Media";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизПодскажите как изменить 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 вся ветка
Форум: "Media";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c