Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1197379394
cvg
2007-12-11 16:23
2008.01.13
Как заставить чарт отображать только последний час?


15-1197234171
Grain_II
2007-12-10 00:02
2008.01.13
алгоритм предсказания результатов грядущих выборов


2-1197529644
XerSon
2007-12-13 10:07
2008.01.13
Как перевести сие на код Дельфи т.е написать функцию?


15-1196823493
Slider007
2007-12-05 05:58
2008.01.13
С днем рождения ! 5 декабря 2007 среда


8-1166004227
Николай_Москва
2006-12-13 13:03
2008.01.13
Разложить отрезок по цветам пикселей





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