Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
1-41514
Yuri Btr
2003-10-28 13:03
2003.11.13
Передача объектов и их свойств из функций


4-42327
Guest
2003-09-04 15:19
2003.11.13
Переключение раскладки


1-41313
alexnmsk
2003-10-31 10:28
2003.11.13
Как программно добавить Frame к форме


3-41053
NewD
2003-10-24 11:49
2003.11.13
При попытке добавить запись вылетает ошибка.


7-42190
Vince
2003-08-28 19:56
2003.11.13
Ошибка при обрашении к LPT





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский