Канва и палитра
Автор: zacetavtom11 • Январь 25, 2021 • Доклад • 1,804 Слов (8 Страниц) • 284 Просмотры
Delphi. Палитра
Канва и палитра
Это область памяти, предназначенная для размещения и редактирования рисунков. Многие визуальные компоненты имеют свойство Canvas, при помощи которого можно размещать рисунки поверх компоненты. Например, компонента Image, разработанная специально для построения изображений, имеет доступ к канве сразу двумя способами:
Image1.Canvas и Image.Picture.Bitmap.Canvas.
Канва является прямоугольным массивом, элементы которого индексируются от [0, 0]. Каждому элементу канвы соответствует точка рисунка, цвет которой определяется числовым кодом.
Чтобы построить точку на канве достаточно выполнить процедуру
Pixels[x, y]:= цвет точки,
где x, y – координаты точки на канве, а цвет точки выражается некоторым числом.
Имеется несколько способов сгенерировать код цвета.
- Код выражается в системе RGB тремя числовыми компонентами (триплетом): «красный», «зелёный», «синий» по формуле
«красный»*256*256 + «зелёный»*256 + «синий»,
где компоненты представляются однобайтовыми значениями (интенсивностью). - Код определяется порядковым номером цвета относительно цветовой палитры. Палитра представляет собой одномерный массив, элементами которого служат цвета, закодированные предыдущим способом. Код формируется выражением
$01000000 + номер цвета.
При этом важно знать, сколько цветов в палитре (обычно 256) и какого соответствие между цветами и их номерами.
Например,
Image1.Canvas.Pixels[10,15y]:=$0FF0 или Image1.Canvas.Pixels[10,15y]:= $01000000+8.
Кажется, наиболее естественным задавать цвет при помощи триплета, однако не всякий видеоадаптер способен генерировать произвольные цвета. Обычно Windows подбирает наиболее близкий цвет из имеющихся цветов в палитре. Второй метод кодировки может оказаться более удобным при программировании динамических картинок.
Размер элемента канвы может составлять 1, 4, 8, 15, 16, 24 или 32 бита. Чтобы задать количество бит на точку требуется присвоить значение свойству
Image1.Picture.Bitmap.PixelFormat:= размер элемента,
где размером должно служить одно из значений
pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit.
Текущее значение свойства возвращается, например, функцией
Ord(Image1.Picture.Bitmap.PixelFormat).
Чтобы сформировать собственную палитру необходимо сделать ряд шагов.
Сначала опишем стандартную структуру палитры 8 битной канвы
Implementation
Type
LogPal= //Палитра
Record
Begin
p:TLogPalette; //Заголовок палитры – запись с полями
//palVersion: Word – номер версии (всегда = $300)
//palNumEntries: Word – количество цветов (будет = 256)
//palPalEntry: Array[0..0] Of TPaletteEntry – первый цвет
// Единственным элементом служит запись типа
// peRed - красная компонента
// peGreen - зелёная компонента
// peBlue - синяя компонента
// peFlags - флаги
m:Array[1..255] Of TPaletteEntry; //Расширение массива palPalEntry до 256 элементов
End;
Создадим переменную типа LogPal.
Var
SP:LogPal; //Экземпляр палитры
Разным визуальным компонентам можно назначать разные палитры. При этом каждая компонента будет использовать собственную палитру. В качестве примера разработаем процедуру формирования палитры для Image1 вынесенной на форму Form1.
procedure SetPL;
Begin
With Form1.Image1.Picture.Bitmap do
...