Форум: "Игры";
Текущий архив: 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