![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с графикой в 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 функция?