Форум: "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