![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Кстати да, вполне возможно что не только бисером но и вышивание гладью. Там тоже ограниченное количество цветов, но там другая сложность - разные цветовые схемы со своим порядком цветов и нумерацией.
|
|
#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; |