Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.08.2011, 21:47
Pcrepair
 
Сообщения: n/a
По умолчанию Как получить цвет пикселя из палитры BMP 8bit

Добрый день!
Нужна помощь в разработке кода процедуры
как известно, в BMP 8bit файле на пиксель приходиться байт, в котором хранится число, соответсвующее цвету в палитре. в то же время в палитре каждому цвету соответсвует 4-е байта (BGR)
Вопрос:
1. каким образом по числу, хранящимуся в байте пикселя, происходит сопоставление с блоком из 4-х байт в палитре, соотвествующих цвету. при отображении пикселя на TImage
2. каким может быть код процедуры, обработка нажатия на кнопку
- ввод числа в TEdit (аналог числа в байте пикселя)
нажимаем на кнопку
- поиск в палитре
- вывод значений 4-х байт в TLabel (к примеру)
- или вывод ошибки (такого цвета нет в палитре)
Самостоятельно что то с трудом представляю как это можно сделать
Спасибо за внимание
Ответить с цитированием
  #2  
Старый 19.08.2011, 09:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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;
Вложения
Тип файла: rar PaletteEntry.rar (129.2 Кбайт, 22 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 19.08.2011, 19:27
Pcrepair
 
Сообщения: n/a
По умолчанию

Спасибо за пример, но.....
программа выводит палитру в таблицу в графическом виде из графического файла (там разве БМП?) спрятанного в файле ресурсов

мне нужно совсем другое, еще раз:
допустим есть байт пикселя с индексом? 236 или 0хEC в массиве пикселей
ему соответсвуют 4-байта BGRA в палитре
мне нужно получить значения этих байт в числовом формате
ну типа,
пиксел = 0xEC, соответсвующие ему значения цветов
B = 0x44
G = 0x55
R = 0x66
каким образом определить какому индексу соответсвуют цвета?
палитра занимает с 54 по 1078 байт в файле, может нужно разбить это пространство на блоки по 4-е байта, назначить каждому блоку свой номер-индекс в 16-й системе и это и будет соответсвие между индексом в байте пикселя и индексом в палитре?
Ответить с цитированием
  #4  
Старый 19.08.2011, 21:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну наконец-то понял, что здесь простая арифметика.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 19.08.2011, 23:18
Pcrepair
 
Сообщения: n/a
По умолчанию

то что стало понятно - это хорошо

а конкретно, как это можно реализовать в коде?
Ответить с цитированием
  #6  
Старый 19.08.2011, 23:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pcrepair
то что стало понятно - это хорошо

а конкретно, как это можно реализовать в коде?

Не мне, тебе стало понятно. Я это давно знаю. Считать в буфер палитру и там уже смотреть.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 19.08.2011, 23:26
Pcrepair
 
Сообщения: n/a
По умолчанию

то есть готовых решений пока еще нет? никто такого еще не делал?

Тогда что то типа:
надо записать в массив байты с 54 по 1078 из БМП файла, и если код в байте пикселя = 00, тогда использовать 54...57 байты массива как искомое значение, ну и далее....
а это точно?
Ответить с цитированием
  #8  
Старый 19.08.2011, 23:30
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Просто решение настолько элементарное, что стыдно спрашивать.
Когда ты считываешь в массив, то он обычно адресуется с 0, и соответственно твой 00 будет указывать на 0-вое смещение в массиве.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 19.08.2011, 23:32
Pcrepair
 
Сообщения: n/a
По умолчанию

ну это кому как

если есть код, не стесняйся, напиши
Ответить с цитированием
  #10  
Старый 19.08.2011, 23:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Нахал . Считай, к примеру, в поток (TMemoryStream), установи Seek на 54 (начало палитры)... дальше как удобнее или пользуйся потоком или с установленной позиции скопируй в массив.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 19.08.2011, 23:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Если не ошибся, примерно так:
Код:
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  
Старый 19.08.2011, 23:51
Pcrepair
 
Сообщения: n/a
По умолчанию

за код отдельное спасибо, с массивами пока еще программок не лепил, поэксперементирую
но все таки возвратимся к методологии
это действительно будет правильный подход, когда значение байта пикселя = 00 приравнивается к первым 4-м байтам палитры?
или это просто догадки
массив пикселей, к примеру, в БМП-файле начинается с последнего байта файла. может тут тоже есть какие то косяки?
Ответить с цитированием
  #13  
Старый 20.08.2011, 00:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я потому и выделил под массив 1024 байта, что максимальный размер палитры 256 * 4. Но палитра не всегда бывает полной в 256 элементов она может быть и укороченной, естественно разговор идёт о соответствующем формате 8bpp. Тебе бы почитать о структуре BMP, набери в поиске и почитай. Многое прояснится.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 20.08.2011, 00:24
Pcrepair
 
Сообщения: n/a
По умолчанию

структуру БМП-файла уже знаю наизусть

еще раз о методологии
откуда известно что это есть правильный подход
считать что значение байта пикселя = 00 соответсвует первым 4-м байтам палитры? может последним?

у меня порядка 8-и описаний формата БМП из разных источников, но нигде этот вопрос не рассматривается

везде упоминается "индекс" что такое значит индекс в данном контексте обсуждения? индекс это число? к примеру 00?
Ответить с цитированием
  #15  
Старый 20.08.2011, 00:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Значит плохо читал.
Индекс он и в Африке индекс, смещение от указанного начала счёта.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:59.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025