![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() то есть готовых решений пока еще нет? никто такого еще не делал?
Тогда что то типа: надо записать в массив байты с 54 по 1078 из БМП файла, и если код в байте пикселя = 00, тогда использовать 54...57 байты массива как искомое значение, ну и далее.... а это точно? |
#8
|
||||
|
||||
![]() Просто решение настолько элементарное, что стыдно спрашивать.
Когда ты считываешь в массив, то он обычно адресуется с 0, и соответственно твой 00 будет указывать на 0-вое смещение в массиве. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() ну это кому как
если есть код, не стесняйся, напиши |
#10
|
||||
|
||||
![]() Нахал
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
||||
|
||||
![]() Если не ошибся, примерно так:
Код:
var Buf : array[0..1023] of Byte; Stream : TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile('MyBmp.bmp'); Stream.Position := 54; Stream.Read(Buf, 1024); finally Stream.Free; end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 20.08.2011 в 00:12. |
#12
|
|||
|
|||
![]() за код отдельное спасибо, с массивами пока еще программок не лепил, поэксперементирую
но все таки возвратимся к методологии это действительно будет правильный подход, когда значение байта пикселя = 00 приравнивается к первым 4-м байтам палитры? или это просто догадки массив пикселей, к примеру, в БМП-файле начинается с последнего байта файла. может тут тоже есть какие то косяки? |
#13
|
||||
|
||||
![]() Я потому и выделил под массив 1024 байта, что максимальный размер палитры 256 * 4. Но палитра не всегда бывает полной в 256 элементов она может быть и укороченной, естественно разговор идёт о соответствующем формате 8bpp. Тебе бы почитать о структуре BMP, набери в поиске и почитай. Многое прояснится.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#14
|
|||
|
|||
![]() структуру БМП-файла уже знаю наизусть
еще раз о методологии откуда известно что это есть правильный подход считать что значение байта пикселя = 00 соответсвует первым 4-м байтам палитры? может последним? у меня порядка 8-и описаний формата БМП из разных источников, но нигде этот вопрос не рассматривается везде упоминается "индекс" что такое значит индекс в данном контексте обсуждения? индекс это число? к примеру 00? |
#15
|
||||
|
||||
![]() Значит плохо читал.
Индекс он и в Африке индекс, смещение от указанного начала счёта. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |