Форум по 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  
Старый 21.08.2011, 08:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Pcrepair
мне нужно совсем другое
Цитата:
Сообщение от Pcrepair
каким образом определить какому индексу соответсвуют цвета?
думал догадаешься:
Код:
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;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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