![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Добрый день!
Нужна помощь в разработке кода процедуры как известно, в BMP 8bit файле на пиксель приходиться байт, в котором хранится число, соответсвующее цвету в палитре. в то же время в палитре каждому цвету соответсвует 4-е байта (BGR) Вопрос: 1. каким образом по числу, хранящимуся в байте пикселя, происходит сопоставление с блоком из 4-х байт в палитре, соотвествующих цвету. при отображении пикселя на TImage 2. каким может быть код процедуры, обработка нажатия на кнопку - ввод числа в TEdit (аналог числа в байте пикселя) нажимаем на кнопку - поиск в палитре - вывод значений 4-х байт в TLabel (к примеру) - или вывод ошибки (такого цвета нет в палитре) Самостоятельно что то с трудом представляю как это можно сделать Спасибо за внимание |
|
#2
|
||||
|
||||
|
Код:
var
APaletteEntry: array [0..$ff] of PALETTEENTRY;
ANumberEntries: Integer;
i: Integer;
APanel: TPanel;
begin
ANumberEntries:=GetPaletteEntries(Image1.Picture.Bitmap.Palette,
0, $100,APaletteEntry);
if ANumberEntries=0 then raise Exception.Create('GetPaletteEntries');
for i:=0 to ANumberEntries-1 do
begin
APanel:=TPanel.Create(Self);
APanel.Width:=32;
APanel.Height:=32;
APanel.Left:=(i mod 16)*32;
APanel.Top:=(i div 16)*32+136;
APanel.Color:=RGB(APaletteEntry[i].peRed, APaletteEntry[i].peGreen,APaletteEntry[i].peBlue);
APanel.Parent:=Self;
end;
end; |
|
#3
|
|||
|
|||
|
Спасибо за пример, но.....
программа выводит палитру в таблицу в графическом виде из графического файла (там разве БМП?) спрятанного в файле ресурсов мне нужно совсем другое, еще раз: допустим есть байт пикселя с индексом? 236 или 0хEC в массиве пикселей ему соответсвуют 4-байта BGRA в палитре мне нужно получить значения этих байт в числовом формате ну типа, пиксел = 0xEC, соответсвующие ему значения цветов B = 0x44 G = 0x55 R = 0x66 каким образом определить какому индексу соответсвуют цвета? палитра занимает с 54 по 1078 байт в файле, может нужно разбить это пространство на блоки по 4-е байта, назначить каждому блоку свой номер-индекс в 16-й системе и это и будет соответсвие между индексом в байте пикселя и индексом в палитре? |
|
#4
|
||||
|
||||
|
Ну наконец-то понял, что здесь простая арифметика.
|
|
#5
|
|||
|
|||
|
то что стало понятно - это хорошо
а конкретно, как это можно реализовать в коде? |
|
#6
|
||||
|
||||
|
Цитата:
Не мне, тебе стало понятно. Я это давно знаю. Считать в буфер палитру и там уже смотреть. |
|
#7
|
||||
|
||||
|
Цитата:
Цитата:
Код:
function GetPaletteColor(ABitmap: TBitmap; AIndex: Integer): Integer;
var
APaletteEntry: array [0..$ff] of PALETTEENTRY;
ANumberEntries: Integer;
begin
ANumberEntries:=GetPaletteEntries(ABitmap.Palette,
0, $100,APaletteEntry);
if ANumberEntries=0 then raise Exception.Create('GetPaletteEntries');
if ((AIndex<0) or (AIndex>=ANumberEntries)) then raise Exception.Create('NumberEntries');
Result:=RGB(APaletteEntry[AIndex].peRed, APaletteEntry[AIndex].peGreen,APaletteEntry[AIndex].peBlue);
end;Код:
var
c: Integer;
r, g, b: Integer;
begin
c:=GetPaletteColor(Image1.Picture.Bitmap, 236);
r:=GetRValue(c);
g:=GetGValue(c);
b:=GetBValue(c);
ShowMessage('r='+IntToStr(r)+' g='+IntToStr(g)+' b='+IntToStr(b));
end; |