Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.06;
Скачать: CL | DM;

Вниз

Создание и использование 256-цветной палитры   Найти похожие ветки 

 
Jimmy   (2006-08-20 09:16) [0]

Взял нижеуказанный код из DelphiWorld2004. Есть несколько вопросов.
1. Неописана переменная hPal. Как правильно это сделать, какого типа она должна быть, глобальной или локальной?
2. Я могу задавать все цвета от 0 до 255? Я где-то слышал что первые и последние 10 цветов нельзя использовать.
3. Как использовать эту процедру? Я просто после выполнения этой процедуры пытаюсь рисовать на forBitMap. Надо ли использовать API функции SelectPalette и RealizePalette, если да, то как? Можно ли после строки forBitMap.Palette := hPal;
вставить еще forBitMap2.Palette := hPal; если я хочу использовать одну палитру на 2-х битмэпах?
Заранее спасибо.

procedure TfrmMain.MakePalette(forBitMap: TBitMap);
var
 pNewPal: PLogPalette;
 lSize: LongInt;
 nCntr: Byte;
begin
 lSize := SizeOf(TLogPalette) +
   SizeOf(TPaletteEntry) * 256;
 try
   GetMem(pNewPal, lSize);
   pNewPal^.palNumEntries := 256;
   pNewPal^.palVersion := $300;
{$R-} {выключаем контроль допустимого диапазона}
   {создаем данные палитры...}
   for nCntr := 0 to 254 do
   begin
     pNewPal^.palPalEntry[nCntr].peRed := nCntr + 20;
     pNewPal^.palPalEntry[nCntr].peGreen := nCntr + 20;
     pNewPal^.palPalEntry[nCntr].peBlue := nCntr + 20;
     pNewPal^.palPalEntry[nCntr].peFlags := pc_nocollapse;
   end;
{$R+} {включаем контроль допустимого диапазона}
   {удаляем старый hPal; предохраняемся от утечки памяти}
   DeleteObject(hPal);
   {создаем новую палитру на основе новых значений}
   hPal := CreatePalette(pNewPal^);
   {назначаем новую палитру}
   forBitMap.Palette := hPal;
 finally
   FreeMem(pNewPal, lSize);
 end;
end;


 
Мефисто   (2006-08-20 12:49) [1]


> Jimmy   (20.08.06 09:16) 


Не ясна суть задачи. Опиши задачу в целом.

По коду - создается палитра для TBitmap если количество цветов растра не более 256 цветов. При большем количестве цветов - грабли.

Для получения/загрузки цветовой таблицы растра можно воспользоваться:
GetDIBColorTable
SetDIBColorTable

Для получения оптимальной цветовой политры для растров HighColor and TrueColor нужно произвести квантование цветов растра.

К прочтению: Фень Юань "Программирование графики для Windows"
Издательство "Питер"


 
Jimmy   (2006-08-20 18:34) [2]

Я действительно работаю с 256-цветным bitmap. Я тут недавно задавал вопрос по поводу большого image, так вот это один из вариантов - жрет меньше памяти. Делаю bitmap.pixelformat:=pf8bit, потом в зависимости от действий пользователя устанавливаю этому bitmap"у определенную палитру и затем рисую на нем. Все бы хорошо (почти все работает), но иногда появляется ряд ошибок, одна из них "image bitmap is not valid", другая - "выход за пределы", что-то там про ранг, в строке GetRValue. Так что похоже я что-то делаю не так, но что - не понимаю.


 
Мефисто   (2006-08-20 19:31) [3]


>  но иногда появляется ряд ошибок, одна из них "image bitmap
> is not valid", другая - "выход за пределы", что-то там про
> ранг, в строке GetRValue. Так что похоже я что-то делаю
> не так, но что - не понимаю.


Очень похоже, что что-то нето. Код приводи.


 
Vovan#1   (2006-08-21 23:07) [4]

>1. Неописана переменная hPal. Как правильно это сделать, какого типа она должна быть, глобальной или локальной?

hPal : hPalette;
Решать тебе, ведь hPal ещё надо удалить. Где ты будешь это делать - зависит от твоих целей.

Если хочешь - можно без посредников:
Bitmap.Palette := CreatePalette(pNewPal^);

>Можно ли после строки forBitMap.Palette := hPal;
вставить еще forBitMap2.Palette := hPal; если я хочу использовать одну палитру на 2-х битмэпах?

В Delphi TBitmap копирует палитру себе внутрь, поэтому можно.

>2. Я могу задавать все цвета от 0 до 255? Я где-то слышал что первые и последние 10 цветов нельзя использовать.

Можно, если ты уверен, что программа будет работать в high color или true color. А так действительно, Windows отбирает те цвета под системные.

>3. Как использовать эту процедру?

Собственно, вызови процедуру и рисуй. Остальное - забота внутренних механизмов TBitmap. Не забудь удалить hPal.

-----------

Вообще Мефисто прав - лучше и проще использовать SetDIBColorTable. Для этого объявляешь что-то типа ColorTable: array[255] of TRGBQuad; (TRGBQuad уже сидит в graphics.pas), заполняешь ColorTable от 0 до 255 своими цветами и далее вызываешь:
SetDIBColorTable(Bitmap.Canvas.Handle, 0, 256, ColorTable);
И ещё установи Bitmap.HandleType := bmDIB заранее.

Меньше геморроя и быстрее.


 
Jimmy   (2006-08-23 19:51) [5]

Спасибо, Vovan#1!



Страницы: 1 вся ветка

Текущий архив: 2007.05.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
2-1176705162
allucard
2007-04-16 10:32
2007.05.06
Как созданный класс сделать дочерним классу TForm?


2-1176416482
Могот
2007-04-13 02:21
2007.05.06
MediaPlayer прикол со звуком в видео


15-1175946783
Vudu
2007-04-07 15:53
2007.05.06
Поддержка разных форматов дат


15-1175693490
vasIZmax
2007-04-04 17:31
2007.05.06
Может кто-нибудь что-нибудь подскажет


2-1176817310
Gentos
2007-04-17 17:41
2007.05.06
DBImage1: TDBImage; - с какой компонентой проще всего работать ?