Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Затемнение картинки в Image


Автор: Katrina 17.2.2005, 21:00
smile Хочу лучше изучить графику в делфи и так пишу программу "MyDesktop". Здесь столкнулась с проблемой: как затемнить картинку в Image, как это на нормальном десктопе? Может кто-то подскажет, как сделать или даст ссылки. Пожалуйста!! smile

Автор: drinkOut 17.2.2005, 22:41
Посмотри http://delphiworld.narod.ru/_graphic_.html в разделе "Цвета и Палитра". smile

Автор: Katrina 17.2.2005, 22:55
Спасибо за ссылку, но я знаю этот сайт. К сожалению, там не то, что нужно! smile

Автор: ~FoX~ 17.2.2005, 23:06
Katrina
Цитата(Katrina @ 17.2.2005, 21:00)
затемнить картинку в Image

??????????
Что конкретно тебя интересует?????

Автор: Katrina 17.2.2005, 23:12
Меня интересует следующее: если я кликнула на Image, то эта картинка затемняется как на реальном десктопе, кликаю второй раз - снова без затемнения. Плиз, подскажите, как!! smile

Автор: Katrina 18.2.2005, 14:00
Извините за назойливость.
smile Пожалуйста, подскажите, почему.
Использую такую функцию для затемнения картинки:
Код

function TForm1.ChangeColor(InputColor: TColor; Lighten: Boolean): TColor;
var
  r,g,b: extended;
begin
  r := GetRValue(InputColor);
  g := GetGValue(InputColor);
  b := GetBValue(InputColor);
 if Lighten = True then
  begin
    r := r+((r/255)*100);
    g := g+((g/255)*100);
    b := b+((b/255)*100);
  end else
  begin
    r := r-((r/255)*100);
    g := g-((g/255)*100);
    b := b-((b/255)*100);
  end;
 if r > 255 then r := 255;
  if r < 0 then r := 0;
  if g > 255 then g := 255;
  if g < 0 then g := 0;
  if b > 255 then b := 255;
  if b < 0 then b := 0;
 Result := RGB(byte(Round(r)),byte(Round(g)),byte(Round(b)));
end;

В обработчике событий (например, кнопка) пишу так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
begin
for i:=0 to form1.Image1.Width do for j:=0 to form1.Image1.Height do
form1.Image1.Canvas.Pixels[i,j]:=Form1.ChangeColor(form1.Image1.Canvas.Pixels[i,j],false);
end;

С этим кодом картинка затемнена.
На второй кнопке обрабатываю событие, чтобы вернуть картинку обратно (без затемнения):
Код

procedure TForm1.Button2Click(Sender: TObject);
var
i, j: integer;
begin
for i:=0 to form1.Image1.Width do for j:=0 to form1.Image1.Height do
form1.Image1.Canvas.Pixels[i,j]:=Form1.ChangeColor(form1.Image1.Canvas.Pixels[i,j],true);
end;

Так, с этим обратным кодом картинка возвращается, но чуть-чуть затемнена. И так, если кликать снова и снова, то в итоге через 5-6 кликов картинка будет такая: белый квадрат-черный квадрат и т.д.
Что не так в этом коде, может в этот код что-то нужно добавить?
Заранее спасибо!

Автор: Underdark 18.2.2005, 15:19
Всё дело в простой школьной математике!

Смотри фактически ты делаешь вот так:
пусть r=125, то затемнение r*(1-100/255)=r*(1-0.392)=76;
теперь обратно r*(1.392)=105,792;

Особенность работы с процентами!!! X-Y%+Y%<X!!! smile

P.S.
Условия типа
Цитата

if r < 0 then r := 0;

никогда не выпонятся, т.к. X-Y% всегда больше нуля!!!, если Y<100, а у тебя это так! Поэтому эту проверку, в данном случае, можно убрать вовсе!

P.P.S.
Попробуй делать затемнение и засветление на определеное число (например, r:=r-58), но тогда надо будет оставить проверку, про которую я говорил выше smile

Автор: Katrina 18.2.2005, 18:38
smile О, спасибо, это здорово работает!
Код

function TForm1.ChangeColor(InputColor: TColor; Lighten: Boolean): TColor;
const
col=60;
var
  r,g,b: extended;
begin
  r := GetRValue(InputColor);
  g := GetGValue(InputColor);
  b := GetBValue(InputColor);
 if Lighten = True then
  begin
    r := r+col; g := g+col; b := b+col;
  end else
  begin
    r := r-col; g := g-col; b := b-col;
  end;
 if r > 255 then r := 255;    if r < 0 then r := 0;
  if g > 255 then g := 255;   if g < 0 then g := 0;
  if b > 255 then b := 255;   if b < 0 then b := 0;
 Result := RGB(byte(Round(r)),byte(Round(g)),byte(Round(b)));
end;

Автор: Zero 20.2.2005, 16:54
Цитата(Katrina @ 17.2.2005, 21:00)
Хочу лучше изучить графику в делфи и так пишу программу "MyDesktop".

Katrina какое совпадение, я в том семестре делал курсач на тему создания Desktop'a, если хочешь могу скинуть, может что-нибудь на какие-нибудь мысли наведёт.

Автор: p0s0l 26.2.2005, 14:55
Перенесено из раздела Дельфи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)