Главная страница
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.5 MB
Время: 0.015 c
3-1188920505
spogi
2007-09-04 19:41
2008.01.13
TTable->Paradox->QRReport


2-1197570008
tork
2007-12-13 21:20
2008.01.13
Форма 2 под формой 1


15-1197029259
Dennis I. Komarov
2007-12-07 15:07
2008.01.13
Знатокам Linux


2-1197536434
Free_Breeze
2007-12-13 12:00
2008.01.13
Получить хинт из другого приложения


2-1197373127
@!!ex
2007-12-11 14:38
2008.01.13
Фиксация углов куба.