Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.08.2011, 15:11
Аватар для sereja-korjik
sereja-korjik sereja-korjik вне форума
Прохожий
 
Регистрация: 31.08.2011
Адрес: Кемерово
Сообщения: 10
Версия Delphi: RAD
Репутация: 10
По умолчанию Поиск более похожего цвета

Здравствуйте, Форумчане! Возник такой вопрос, связанный с цветом. Задача такова: У меня есть список нескольких разных цветов, допустим их 10. Каждый называется по своему. И есть диалог выбора цвета, после выбора которого программа должна сравнить этот выбранный в диалоге цвет с цветами из того списка цветов, и выдать мне более похожий из этих десяти.
Заранее спасибо за размышления по теме!
Ответить с цитированием
  #2  
Старый 31.08.2011, 15:48
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
{$EXTERNALSYM GetRValue}
function GetRValue(rgb: DWORD): Byte; inline;
{$EXTERNALSYM GetGValue}
function GetGValue(rgb: DWORD): Byte; inline;
{$EXTERNALSYM GetBValue}
function GetBValue(rgb: DWORD): Byte; inline;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 31.08.2011, 15:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

в диалоге выбора цвета дать возможность выбора только одного из твоих 10 цветов.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 31.08.2011, 16:03
Аватар для sereja-korjik
sereja-korjik sereja-korjik вне форума
Прохожий
 
Регистрация: 31.08.2011
Адрес: Кемерово
Сообщения: 10
Версия Delphi: RAD
Репутация: 10
По умолчанию

Суть в другом. Я выбираю Совершенно Любой Цвет в диалоге, и потом идет сравнение, в котором находится самый близкий к выбранному из диалога из всех этих 10 цветов.
Ответить с цитированием
  #5  
Старый 31.08.2011, 16:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

я понял в чем суть. не ясно одно: зачем выбирать цвет из всей палитры, если потом этот цвет приведется к одному из 10 заранее определеных. намного проще сразу выбрать 1 из 10.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 31.08.2011, 16:15
Аватар для sereja-korjik
sereja-korjik sereja-korjik вне форума
Прохожий
 
Регистрация: 31.08.2011
Адрес: Кемерово
Сообщения: 10
Версия Delphi: RAD
Репутация: 10
По умолчанию

Цветов будет не 10, а очень очень много, разные оттенки и насыщенности. Будет как цветовая таблица. Но число этих цветов будет ограничено. А выбранный цвет в диалоге - его надо сравнить с этой цветовой таблицей, и выбрать наиболее нужный.. т.к точно такого же там не будет, нужно искать приближенный, чтобы визуально было похоже
Ответить с цитированием
  #7  
Старый 31.08.2011, 17:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

критерием похожести что является? Расположение двух цветов на некоем промежутке? Скажем в вашем случае 1 и 10 непохожи а 3 и 4 похожи?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 31.08.2011, 17:37
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Меня этот вопрос тоже немного интересует.
А критерий похожести:
Розовый похож на красный
Оранжевый на желтый
Сиреневый на голубой
и т.п.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 31.08.2011, 22:49
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Для формата RGB можно искать минимум (R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2. Но существуют и другие форматы, например, HSV (яркость, которая в цвете не участвует, и два цветоразностных сигнала).

Добавка. Прошу прощения, написал HSV, а стал описывать YUV, короче, способов кодировки цвета (кадр, изображение) пруд пруди.

Последний раз редактировалось AlexSku, 01.09.2011 в 18:45.
Ответить с цитированием
  #10  
Старый 01.09.2011, 11:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а чем способ MS (GetNearestPaletteIndex) не подходит?
Цитата:
GetNearestPaletteIndex Function
The GetNearestPaletteIndex function retrieves the index for the entry in the specified logical palette most closely matching a specified color value.

Syntax

UINT GetNearestPaletteIndex(
__in HPALETTE hpal,
__in COLORREF crColor
);

Parameters

hpal [in]
A handle to a logical palette.

crColor [in]
A color to be matched. To create a COLORREF color value, use the RGB macro.

Return Value

If the function succeeds, the return value is the index of an entry in a logical palette.

If the function fails, the return value is CLR_INVALID.
http://msdn.microsoft.com/en-us/libr...03(VS.85).aspx

Цитата:
function GetNearestPaletteIndex(p1: HPALETTE; p2: COLORREF): UINT; stdcall;

Получает ближайший совпадающий с Color цвет в логической палитpе.

функция:

Код:
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  
Старый 02.09.2011, 09:50
Аватар для Physicist
Physicist Physicist вне форума
Прохожий
 
Регистрация: 04.04.2010
Сообщения: 21
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Меня этот вопрос тоже немного интересует.
...

Похоже, речь идёт о конвертации картинки в схему для вышивания бисером:
http://www.delphisources.ru/forum/sh...ad.php?t=17909
__________________
Лечить и учить умеют все, а вот рассчитать несущую балку...
Ответить с цитированием
  #12  
Старый 02.09.2011, 10:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Кстати да, вполне возможно что не только бисером но и вышивание гладью. Там тоже ограниченное количество цветов, но там другая сложность - разные цветовые схемы со своим порядком цветов и нумерацией.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 03.09.2011, 19:07
Аватар для sereja-korjik
sereja-korjik sereja-korjik вне форума
Прохожий
 
Регистрация: 31.08.2011
Адрес: Кемерово
Сообщения: 10
Версия Delphi: RAD
Репутация: 10
По умолчанию

Огромное спасибо за помощь! Функция GetNearestPaletteIndex помогла
Ответить с цитированием
  #14  
Старый 04.09.2011, 21:49
Аватар для sereja-korjik
sereja-korjik sereja-korjik вне форума
Прохожий
 
Регистрация: 31.08.2011
Адрес: Кемерово
Сообщения: 10
Версия Delphi: RAD
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
а чем способ MS (GetNearestPaletteIndex) не подходит?

как я понял, тут не получится вбить массив, в котором 500 элементов.. ошибка. что-то в Move.
Ответить с цитированием
  #15  
Старый 05.09.2011, 08:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

потому что TMaxLogPalette определена в Windows как:
Код:
  TMaxLogPalette = packed record
    palVersion: Word;
    palNumEntries: Word;
    palPalEntry: array [Byte] of TPaletteEntry;
  end;
т.е. макс. 256 цветов. но можно ее переопределить на 65536, к примеру, цветов:
Код:
type
  PMaxLogPalette = ^TMaxLogPalette;
  TMaxLogPalette = packed record
    palVersion: Word;
    palNumEntries: Word;
    palPalEntry: array [Word] of TPaletteEntry;
  end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter