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

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

RGB, CMY GetRValue подбор цветов перехода...


Vladimir1984 ©   (2006-12-05 22:59:00) 

Не могу подобрать цвета чтобы переход был плавным:
Самый слабый - Красный
Слабый - Желтый
слабый средний - Зеленый
Сильный средний - Голубой
Сильный  - Синий
Самый Сильный - Магнетта

procedure TfrmPulsar3D.bmp1Click(Sender: TObject);
var
i,j,k:Integer;
begin
try
  if OpenPictureDialog1.Execute then
    if FileExists(OpenPictureDialog1.FileName) then
    begin
      bmp.Width:=0;
      bmp.Height:=0;
      bmp.LoadFromFile(OpenPictureDialog1.FileName);
      w:=bmp.Width;
      h:=bmp.Height;
      SetLength(vx,w);
      SetLength(nx,w);
      SetLength(cx,w);
      for i:=0 to w-1 do
      begin
        SetLength(vx[i],h);
        SetLength(nx[i],h);
        SetLength(cx[i],h);
      end;
      for i:=0 to w-1 do
        for j:=0 to h-1 do
      // Âûäåëÿåò çíà÷åíèå èíòåíñèâíîñòè èç çíà÷åíèÿ öâåòà RGB è CMY
      // ãäå R - Êðàñíûé, G - Çåëåíûé, B - Ñèíèé()
      //Ñ -  Cyan, M - Ìàãíåòòà, Y - Æåëòûé
        begin
          vx[i,j]:=(GetRValue(bmp.Canvas.Pixels[i,j])+
          GetGValue(bmp.Canvas.Pixels[i,j+1])+
          GetBValue(bmp.Canvas.Pixels[i,j]))/3/10;
          cx[i,j,1]:=GetRValue(bmp.Canvas.Pixels[i,j])/255;
          cx[i,j,2]:=GetGValue(bmp.Canvas.Pixels[i,j])/255;
          cx[i,j,3]:=GetBValue(bmp.Canvas.Pixels[i,j])/255;
        end;
      for i:=0 to w-1 do
        for j:=0 to h-1 do
          for k:=1 to 3 do
            nx[i,j,k]:=1;
      for i:=0 to w-2 do
        for j:=0 to h-2 do
          CalcNormals(i,vx[i,j],j,
                      i+1,vx[i+1,j],j,
                      i+1,vx[i+1,j+1],j+1,
                      nx[i,j,1],nx[i,j,2],nx[i,j,3]);
    end else
      MessageBox(Handle,
                 PAnsiChar('Ôàéë '+OpenPictureDialog1.FileName+' íå íàéäåí'),
                 'Îøèáêà',MB_OK or MB_ICONERROR);
except
  MessageBox(Handle,
             PAnsiChar('Îøèáêà âî âðåìÿ çàãðóçêè ôàéëà '+
               OpenPictureDialog1.FileName),
             'Îøèáêà',MB_OK or MB_ICONERROR);
end;

end;


Vladimir1984   (2006-12-07 19:23:00) [1]

Я тоже готов, договорились! Напшите сюда: feofilaktov@gmail.com


ancara   (2006-12-07 18:55:00) [2]

может проще заново переписать, меня этот код в депрессию вгоняет, не буду больше смотреть...
 Почем бутылка пива оценивается? Рублев в 30, т.е. 300 р. за решение вопроса?
Я готов, без шуток. Если договорились, то завтра напишу на мыло точное время когда все будет готово и реквизиты вебмани-кошелька.


Vladimir1984   (2006-12-07 18:36:00) [3]

ап ап ап ап ап


Vladimir1984   (2006-12-07 02:37:00) [4]

Ну есть желающие помочь? Кто первый поможет реально(!), с меня 10 бутылок пива, в любой валюте =)


Vladimir1984   (2006-12-06 15:38:00) [5]

Я тоже не особо понял что там происходит, но понял одно. Зависимость высоты от оттенка проиходит тут:

vx[i,j]:=(GetRValue(bmp.Canvas.Pixels[i,j])+
           GetGValue(bmp.Canvas.Pixels[i,j])+
           GetBValue(bmp.Canvas.Pixels[i,j]))/3/10;


В этом случае  та радуга которая мне нужна в виде прямой под углом(от красного к магнетте), строится в виде зигзага...
Вот так -->   http://slil.ru/23526013/1556084683/RGB.jpg

А если немного изменить, например так:

vx[i,j]:=(GetRValue(bmp.Canvas.Pixels[i,j])+
           2*GetGValue(bmp.Canvas.Pixels[i,j])+
           3*GetBValue(bmp.Canvas.Pixels[i,j]))/3/10;


То получится такая картина--> http://slil.ru/23526054/1556084683/R2G3B.jpg

А нужно чтобы была такая:
http://slil.ru/23526112/1556084683/etallone.jpg
2 суток мучаюсь, никак подобрать не могу...

Эта часть в исходнике:

procedure TfrmPulsar3D.bmp1Click(Sender: TObject);
var
 i,j,k:Integer;
begin
 try
   if OpenPictureDialog1.Execute then
     if FileExists(OpenPictureDialog1.FileName) then
     begin
       bmp.Width:=0;
       bmp.Height:=0;
       bmp.LoadFromFile(OpenPictureDialog1.FileName);
       w:=bmp.Width;
       h:=bmp.Height;
       SetLength(vx,w);
       SetLength(nx,w);
       SetLength(cx,w);
       for i:=0 to w-1 do
       begin
         SetLength(vx[i],h);
         SetLength(nx[i],h);
         SetLength(cx[i],h);
       end;
       for i:=0 to w-1 do
         for j:=0 to h-1 do
       // Âûäåëÿåò çíà÷åíèå èíòåíñèâíîñòè èç çíà÷åíèÿ öâåòà RGB è CMY
       // ãäå R - Êðàñíûé, G - Çåëåíûé, B - Ñèíèé()
       //Ñ -  Cyan, M - Ìàãíåòòà, Y - Æåëòûé
         begin
           vx[i,j]:=(GetRValue(bmp.Canvas.Pixels[i,j])+
           0.5*GetGValue(bmp.Canvas.Pixels[i,j])+
           0.5*GetBValue(bmp.Canvas.Pixels[i,j])-

           1.0001*GetMValue(bmp.Canvas.Pixels[i,j])

                     )/3/10;
           cx[i,j,1]:=GetRValue(bmp.Canvas.Pixels[i,j])/255;
           cx[i,j,2]:=GetGValue(bmp.Canvas.Pixels[i,j])/255;
           cx[i,j,3]:=GetBValue(bmp.Canvas.Pixels[i,j])/255;
         end;
       for i:=0 to w-1 do
         for j:=0 to h-1 do
           for k:=1 to 3 do
             nx[i,j,k]:=1;
       for i:=0 to w-2 do
         for j:=0 to h-2 do
           CalcNormals(i,vx[i,j],j,
                       i+1,vx[i+1,j],j,
                       i+1,vx[i+1,j+1],j+1,
                       nx[i,j,1],nx[i,j,2],nx[i,j,3]);
     end else
       MessageBox(Handle,
                  PAnsiChar('Ôàéë '+OpenPictureDialog1.FileName+' íå íàéäåí'),
                  'Îøèáêà',MB_OK or MB_ICONERROR);
 except
   MessageBox(Handle,
              PAnsiChar('Îøèáêà âî âðåìÿ çàãðóçêè ôàéëà '+
                OpenPictureDialog1.FileName),
              'Îøèáêà',MB_OK or MB_ICONERROR);
 end;

end;


ancara   (2006-12-06 13:14:00) [6]

Уфф, порылся коде, ни черта не понял что там происходит :)))

Кароче, что нужно чтобы высота(Y) вершин зависела от оттенка карты высот?
Ну так нет ничего проще! Получаешь этот оттенок из RGB и ставишь Y.
RGB to angle Hue : http://semmix.pl/color/extrans/etr40.htm
hue обычно в диапазоне от 0 до 360 градусов...


Vladimir1984   (2006-12-06 00:28:00) [7]

http://slil.ru/23523666
Вот исходник программы(карта высот), там по мимо исходника 2 радуги в bmp, вот мне и нужно чтобы при открытии ее была прямая под углом...


ancara   (2006-12-05 23:33:00) [8]

Не совсем понял, при чем тут CMY? Надо построить шкалу "самый слабый -> самый сильный" в RGB  а потом ее в CMY конвертировать, так?

Ну построить шкалу можно двумя способами:

первый, в лоб, так сказать:
каждый переход от цвета к цвету в цикле:
красный = 255, 0, 0
желтый = 255, 255, 0
значит в цикле просто наращиваем G,

затем от желтого к зеленому (Lime?):
в цикле уменьшаем R до нуля
ну и т.д. ...

второй:
можно все конвертнуть в HSB и просто наращивать Hue (оттенок), получится как раз такая радуга, но тут лишние конвертации опять же...

Еще замечание: bmp.Canvas.Pixels[i,j] - это медленно, лучше напрямую с областью памяти: bmp.ScanLine[bmp.Height-1] и оттудова читать...

Магнетта -> мажента (малиновый по-русски)...

Про конвертацию в CMY, в код смотрел, не очень понял что такое CalcNormals..
Из RGB в CMY, говорят, обычно так конвертят:
C =1 - R
M =1 - G
Y =1 - B


Наверх

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