![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
то есть готовых решений пока еще нет? никто такого еще не делал?
Тогда что то типа: надо записать в массив байты с 54 по 1078 из БМП файла, и если код в байте пикселя = 00, тогда использовать 54...57 байты массива как искомое значение, ну и далее.... а это точно? |
|
#8
|
||||
|
||||
|
Просто решение настолько элементарное, что стыдно спрашивать.
Когда ты считываешь в массив, то он обычно адресуется с 0, и соответственно твой 00 будет указывать на 0-вое смещение в массиве. |
|
#9
|
|||
|
|||
|
ну это кому как
если есть код, не стесняйся, напиши |
|
#10
|
||||
|
||||
|
Нахал
. Считай, к примеру, в поток (TMemoryStream), установи Seek на 54 (начало палитры)... дальше как удобнее или пользуйся потоком или с установленной позиции скопируй в массив. |
|
#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;Последний раз редактировалось angvelem, 20.08.2011 в 00:12. |
|
#12
|
|||
|
|||
|
за код отдельное спасибо, с массивами пока еще программок не лепил, поэксперементирую
но все таки возвратимся к методологии это действительно будет правильный подход, когда значение байта пикселя = 00 приравнивается к первым 4-м байтам палитры? или это просто догадки массив пикселей, к примеру, в БМП-файле начинается с последнего байта файла. может тут тоже есть какие то косяки? |
|
#13
|
||||
|
||||
|
Я потому и выделил под массив 1024 байта, что максимальный размер палитры 256 * 4. Но палитра не всегда бывает полной в 256 элементов она может быть и укороченной, естественно разговор идёт о соответствующем формате 8bpp. Тебе бы почитать о структуре BMP, набери в поиске и почитай. Многое прояснится.
|
|
#14
|
|||
|
|||
|
структуру БМП-файла уже знаю наизусть
еще раз о методологии откуда известно что это есть правильный подход считать что значение байта пикселя = 00 соответсвует первым 4-м байтам палитры? может последним? у меня порядка 8-и описаний формата БМП из разных источников, но нигде этот вопрос не рассматривается везде упоминается "индекс" что такое значит индекс в данном контексте обсуждения? индекс это число? к примеру 00? |
|
#15
|
||||
|
||||
|
Значит плохо читал.
Индекс он и в Африке индекс, смещение от указанного начала счёта. |