Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Вниз

RGB, CMY GetRValue подбор цветов перехода...   Найти похожие ветки 

 
Vladimir1984   (2006-12-05 22:59) [0]

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

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;


 
ancara ©   (2006-12-05 23:33) [1]

Не совсем понял, при чем тут 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


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

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


 
ancara ©   (2006-12-06 13:14) [3]

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

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


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

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

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;


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

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


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

ап ап ап ап ап


 
ancara ©   (2006-12-07 18:55) [7]

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


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

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



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

Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
2-1197880453
Fran
2007-12-17 11:34
2008.01.13
Дата прописью на калмыцком языке


15-1197217747
Grain
2007-12-09 19:29
2008.01.13
Выборы грядут


2-1197824270
tracert's
2007-12-16 19:57
2008.01.13
Определение максимального размера фонта


2-1197810242
Riply
2007-12-16 16:04
2008.01.13
Свободные Windows Error - ы :)


2-1197666497
Максим
2007-12-15 00:08
2008.01.13
Sendmail





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский