![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Здравствуйте, Форумчане! Возник такой вопрос, связанный с цветом. Задача такова: У меня есть список нескольких разных цветов, допустим их 10. Каждый называется по своему. И есть диалог выбора цвета, после выбора которого программа должна сравнить этот выбранный в диалоге цвет с цветами из того списка цветов, и выдать мне более похожий из этих десяти. 
		
	
		
		
		
		
		
	
		
		
	
	
	Заранее спасибо за размышления по теме!  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	{$EXTERNALSYM GetRValue}
function GetRValue(rgb: DWORD): Byte; inline;
{$EXTERNALSYM GetGValue}
function GetGValue(rgb: DWORD): Byte; inline;
{$EXTERNALSYM GetBValue}
function GetBValue(rgb: DWORD): Byte; inline; | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 в диалоге выбора цвета дать возможность выбора только одного из твоих 10 цветов. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Суть в другом. Я выбираю Совершенно Любой Цвет в диалоге, и потом идет сравнение, в котором находится самый близкий к выбранному из диалога из всех этих 10 цветов. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 я понял в чем суть. не ясно одно: зачем выбирать цвет из всей палитры, если потом этот цвет приведется к одному из 10 заранее определеных. намного проще сразу выбрать 1 из 10. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цветов будет не 10, а очень очень много, разные оттенки и насыщенности. Будет как цветовая таблица. Но число этих цветов будет ограничено. А выбранный цвет в диалоге - его надо сравнить с этой цветовой таблицей, и выбрать наиболее нужный.. т.к точно такого же там не будет, нужно искать приближенный, чтобы визуально было похоже 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 критерием похожести что является? Расположение двух цветов на некоем промежутке? Скажем в вашем случае 1 и 10 непохожи а 3 и 4 похожи? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Меня этот вопрос тоже немного интересует. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	А критерий похожести: Розовый похож на красный Оранжевый на желтый Сиреневый на голубой и т.п.  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Для формата RGB можно искать минимум (R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2. Но существуют и другие форматы, например, HSV (яркость, которая в цвете не участвует, и два цветоразностных сигнала). 
		
	
		
		
		
		
		
		
			Добавка. Прошу прощения, написал HSV, а стал описывать YUV, короче, способов кодировки цвета (кадр, изображение) пруд пруди. Последний раз редактировалось AlexSku, 01.09.2011 в 18:45.  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 а чем способ MS (GetNearestPaletteIndex) не подходит? 
		
	
		
		
		
		
			
		
		
		
		
		
			Цитата: 
	
 Цитата: 
	
 функция: Код: 
	function GetNearestColorFromEntries(const Entries: array of DWORD;
  const AColor: DWORD): DWORD;
var
  LogPalette: TMaxLogPalette;
  APalette: HPALETTE;
  crColor: Cardinal;
begin
  LogPalette.palVersion:=$300;
  LogPalette.palNumEntries:=High(Entries)-Low(Entries)+1;
  Move(Entries, LogPalette.palPalEntry[0],
    SizeOf(DWORD)*LogPalette.palNumEntries);
  APalette:=CreatePalette(PLogPalette(@LogPalette)^);
  crColor:=GetNearestPaletteIndex(APalette, AColor);
  DeleteObject(APalette);
  if crColor<>CLR_INVALID then
    Result:=RGB(LogPalette.palPalEntry[crColor].peRed,
      LogPalette.palPalEntry[crColor].peGreen,
      LogPalette.palPalEntry[crColor].peBlue)
  else Result:=AColor;
end;использование: Код: 
	type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Panel2: TPanel;
    Edit2: TEdit;Код: 
	var c: DWORD; begin c:=$20c0c0; Panel1.Color:=c; Edit1.Text:=IntToHex(c, 8); c:=GetNearestColorFromEntries([$000000, $0000ff, $00ff00, $ff0000, $00ffff, $ff00ff, $ffff00, $ffffff], c); Panel2.Color:=c; Edit2.Text:=IntToHex(c, 8); end; Код: 
	const
  Pal16: array [0..15] of DWORD =
    (clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clDkGray,
     clLtGray, clRed, clLime, clYellow, clBlue, clFuchsia, clAqua, clWhite);
var
  c: DWORD;
begin
  c:=$604020;
  Panel1.Color:=c;
  Edit1.Text:=IntToHex(c, 8);
  c:=GetNearestColorFromEntries(Pal16, c);
  Panel2.Color:=c;
  Edit2.Text:=IntToHex(c, 8);
end;Код: 
	var Entries: array of DWORD; i: Integer; c: DWORD; begin c:=$604020; Panel1.Color:=c; Edit1.Text:=IntToHex(c, 8); SetLength(Entries, 256); for i:=0 to 255 do Entries[i]:=i; c:=GetNearestColorFromEntries(Entries, c); Panel2.Color:=c; Edit2.Text:=IntToHex(c, 8); end; Последний раз редактировалось NumLock, 01.09.2011 в 11:20.  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Похоже, речь идёт о конвертации картинки в схему для вышивания бисером: http://www.delphisources.ru/forum/sh...ad.php?t=17909  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Кстати да, вполне возможно что не только бисером но и вышивание гладью. Там тоже ограниченное количество цветов, но там другая сложность - разные цветовые схемы со своим порядком цветов и нумерацией. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 |