![]() |
|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() Ну наконец-то понял, что здесь простая арифметика.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
![]() то что стало понятно - это хорошо
а конкретно, как это можно реализовать в коде? |
#6
|
||||
|
||||
![]() Цитата:
Не мне, тебе стало понятно. Я это давно знаю. ![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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; Пишу программы за еду. __________________ |