Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с графикой в Delphi, Индексирование цвета [D7, WinXP]


zzz(KOT)zzz ©   (2007-06-17 15:16:00) 

Помогите пожалуйста, скажите как в Delphi:
— если знаешь цвет точки(Tcolor), получить ее индекс(Byte);
— если знаешь индекс точки, получить ее цвет;
Используется стандартная палитра Windows 256 цветов(8 bits).


zzz(KOT)zzz   (2007-06-19 20:22:00) [1]

Палитра 8 bit-ной картинки составлена из 256 цветов, у каждого цвета есть свой индекс 0..255.


Германн   (2007-06-19 02:22:00) [2]


> zzz(KOT)zzz ©   (17.06.07 15:16)
>
> Помогите пожалуйста, скажите как в Delphi:
> — если знаешь цвет точки(Tcolor), получить ее индекс(Byte);
>

А что есть "индекс точки"?


Efir   (2007-06-18 22:23:00) [3]

var
ColorTable256:array [0..255] of RGBQUAD;

GetDIBColorTable(Bitmap.Canvas.Handle,0,256,ColorTable256);

В массиве ColorTable256 вся палитра 8-битного битмапа.


zzz(KOT)zzz   (2007-06-18 22:11:00) [4]

А по индексу цвет можно узнать?


zzz(KOT)zzz   (2007-06-18 15:48:00) [5]

MBo, Спасибо!!! Офигенно помог =)))))
FLogPal.palVersion := $300;
FLogPal.palNumEntries := 256;

GetPaletteEntries(BitMap.Palette, 0, FLogPal.palNumEntries,
FLogPal.palPalEntry);

FHPal := CreatePalette(PLogPalette(@FLogPal)^);
этот код вообще лишним был...)))


MBo   (2007-06-18 15:45:00) [6]

GetNearestPaletteIndex(Bitmap.Palette, AColor)


zzz(KOT)zzz   (2007-06-18 15:31:00) [7]

Написал:
procedure TForm1.Button1Click(Sender: TObject);
var
 s: TColor;
 i: integer;
 BitMap: TBitMap;
 FHPal: HPalette;
 FLogPal: LogPalette;
begin
 BitMap := TBitMap.Create;
 BitMap.LoadFromFile('c:\1.bmp');
 BitMap.PixelFormat := pf8bit;

 FLogPal.palVersion := $300;
 FLogPal.palNumEntries := 256;

 GetPaletteEntries(BitMap.Palette, 0, FLogPal.palNumEntries,
 FLogPal.palPalEntry);

 FHPal := CreatePalette(PLogPalette(@FLogPal)^);

 s := RGB(0,0,0);
 i := GetNearestPaletteIndex(FHPal,s);

 Label1.Caption := IntToStr(i);
end;

Но что - то опять не нравиться. Пошагово проверяю, значения в принципе находит правильно. Но в конце выполнения выдает асемблеровский код и непонятно о чем ошибку Project.exe faulted with message: 'access violation at 0x00c020c0 read of address 0x00c020c0'. Process Stopped. Use Step or Run to continue.


MBo   (2007-06-18 13:28:00) [8]

У тебя же FLogPal мусором заполнена.
Откуда брать палитру, я уже сказал.


Efir   (2007-06-18 12:12:00) [9]

Лучше разобраться с API ф-цией GetDIBColorTable/SetDIBColorTable, по-моему удобней будет, чем создавать логическую палитру.


zzz(KOT)zzz   (2007-06-18 12:00:00) [10]

А как задать эту логическую палитру, чтобы в итоге индексы соответствовали стандартным виндоусовским. Нашел в инете кое какую инфу, че т не получается:
FLogPal: LogPalette;
FHPal: HPalette;
s: TColor;
i: Integer;

FLogPal.palVersion := $300;
FLogPal.palNumEntries := 256; //2^BPP
FHPal := CreatePalette(PLogPalette(@FLogPal)^);
s := RGB(xx,xx,xx);
i := GetNearestPaletteIndex(FHPal,s);
Находится какой то индекс, но уж больно левый, не тот, который мне нужен.


MBo   (2007-06-18 06:37:00) [11]

GetNearestPaletteIndex
(понадобится логическая палитра, выбранная в целевом контексте)


Kolan   (2007-06-17 15:46:00) [12]

RGB функция?


Наверх

Титульная страница Поиск, карта сайта Написать письмо