|
|
Регистрация | << Правила форума >> | 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; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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
|
||||
|
||||
Кстати да, вполне возможно что не только бисером но и вышивание гладью. Там тоже ограниченное количество цветов, но там другая сложность - разные цветовые схемы со своим порядком цветов и нумерацией.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#13
|
||||
|
||||
Огромное спасибо за помощь! Функция GetNearestPaletteIndex помогла
|
#14
|
||||
|
||||
Цитата:
как я понял, тут не получится вбить массив, в котором 500 элементов.. ошибка. что-то в Move. |
#15
|
||||
|
||||
потому что TMaxLogPalette определена в Windows как:
Код:
TMaxLogPalette = packed record palVersion: Word; palNumEntries: Word; palPalEntry: array [Byte] of TPaletteEntry; end; Код:
type PMaxLogPalette = ^TMaxLogPalette; TMaxLogPalette = packed record palVersion: Word; palNumEntries: Word; palPalEntry: array [Word] of TPaletteEntry; end; Пишу программы за еду. __________________ |