Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

Создание и использование 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 вся ветка

Форум: "Media";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.045 c
2-1176817136
Gentos
2007-04-17 17:38
2007.05.06
Oracle8 - cLOB


15-1175864270
kaif
2007-04-06 16:57
2007.05.06
Прогресс человечества


2-1176459620
Romm
2007-04-13 14:20
2007.05.06
Вопросик...


2-1176787851
allucard
2007-04-17 09:30
2007.05.06
Как внутри класса динамически создавать обьекты?


2-1176906265
Oleg_teacher
2007-04-18 18:24
2007.05.06
Image в Memo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский