Информация о состоянии каждого пикселя хранится в закодированном виде в памяти компьютера. Код может быть однобитовым, двухбитовым и т. д.
Код пикселя — это информация о цвете пикселя.
Для получения черно-белого изображения (без полутонов) пиксель может находиться в одном из двух состояний: светится — не светится (белый — черный). Тогда для его кодирования достаточно одного бита памяти:
1 — белый,
0 — черный.
Пиксель на цветном дисплее может иметь различную окраску. Поэтому одного бита на пиксель недостаточно.
Для кодирования четырехцветного изображения требуется двухбитовый код, поскольку с двух битов можно выразить 4 различных значения (отобразить 4 различных состояния). Может использоваться, например такой вариант кодирования цветов:
00 — черный, 10 — зеленый,
01 — красный, 11 — коричневый.
Из трех базовых цветов — зеленого, красного, синего — можно получить восемь комбинаций трехбитового кода:
--- черный, к -- красный,
-- с синий, к - с розовый,
- з - зеленый, к з - коричневый,
- з с голубой, к з с белый.
В этом коде каждый базовый цвет обозначается его первой буквой (к — красный, с — синий, з — зеленый). Черточка означает отсутствие цвета.
Следовательно, для кодирования восьмицветного изображения требуются 3 бита памяти на один видеопиксель. Если наличие базового цвета обозначить единицей, а отсутствие — нулем, то получается таблица кодировки восьмицветной палитры (табл. 4.1).
Из сказанного, казалось бы, следует вывод: с трех базовых цветов нельзя получить палитру, содержащую больше восьми цветов. Однако на экранах современных компьютеров получают цветные изображения, составленные из сотен, тысяч и даже миллионов различных красок и оттенков. Как это достигается?
Если иметь возможность управлять интенсивностью (яркостью) свечения базовых цветов, то количество различных вариантов их сочетаний, дающих разные краски и оттенки, увеличивается.
Шестнадцатицветная палитра получается при использовании четырехразрядной кодировки пикселя; к трем битам базовых цветов добавляется один бит интенсивности. Этот бит управляет яркостью всех трех цветов одновременно (интенсивностью трех электронных пучков) (табл. 4.2).
Большее количество цветов получается при раздельном управлении интенсивностью базовых цветов. Причем интенсивность может иметь более двух уровней, если для кодирования интенсивности каждого из базовых цветов выделять больше одного бита.
Из сказанного можно вывести правило:
Количество различных цветов К и количество битов для их кодирования b связаны между собой формулой: К = 2b.
21 = 2, 22= 4, 23 = 8, 24 = 16 и т. д. Для получения цветовой гаммы из 256 цветов требуется 8 битов = 1 байт на каждый пиксель, так как 28 = 256.
Объем видеопамяти
Объем необходимой видеопамяти определяется размером графической сетки дисплея и количеством цветов. Минимальный объем видеопамяти должен быть таким, чтобы в него помещался один кадр (одна страница) изображения. Например, для сетки 640 х 480 и черно-белого изображения минимальный объем видеопамяти должен быть таким:
640 · 480 · 1 бит = 307 200 бит = 38 400 байт.
Это составляет 37,5 Кбайт.
Для четырехцветной гаммы и той же графической сетки видеопамять должна быть в два раза больше — 75 Кбайт; для восьмицветной — 112,5 Кбайт.
На современных высококачественных дисплеях используется палитра более чем из 16 миллионов цветов. Требуемый размер видеопамяти в этом случае — несколько мегабайтов.
Коротко о главном
Информация в видеопамяти — это двоичные коды, обозначающие цвета пикселей на экране.
Для кодирования двух цветов достаточно 1 бита на пиксель; четырех цветов — 2 битов; восьми цветов — 3 битов; шестнадцати цветов — 4 битов и т. д. Количество цветов К и размер кода в битах b связаны формулой: К — 2b.
Из трех базовых цветов можно получить 8 различных цветов, Большее число цветов получается путем управления интенсивностью базовых цветов.
Минимально необходимый объем видеопамяти зависит от размера сетки пикселей и от количества цветов. Обычно в видеопамяти помещается несколько страниц (кадров) изображения одновременно.
const
nDay:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
type
Date=record
Day,Month,Year:integer
end;
function DOW(Dat:Date):integer;
// день недели по дате. 0-Вс. 1-Пн, 7-Сб
var
a,y,m:integer;
begin
With Dat do begin
a:=(14 - month) div 12;
y:=Year-a;
m:=month+12*a-2;
DOW:=(7000+(day+y+y div 4-y div 100+y div 400+(31*m) div 12)) mod 7
end
end;
procedure DMY2Date(d,m,y:integer; var data:Date);
// Преобразует к дате заданные день, месяц и год
begin
data.Day:=d; data.Month:=m; data.Year:=y
end;
procedure LastDays(month,year:integer; var Wd,Fr:Date);
// даты последней среды (Wd) и пятницы (Fr) для месяца в году }
var
LastDay:Date;
n:integer;
begin
n:=nDay[month];
if (month=2) and (year mod 4 = 0) then Inc(n);
DMY2Date(n,month,year,LastDay);
n:=DOW(LastDay); // номер последнего дня недели
Wd.Month:=month; Wd.Year:=year;
if n<3 then Wd.Day:=LastDay.Day-(n+4)
else
if n=3 then Wd.Day:=LastDay.Day
else Wd.Day:=LastDay.Day+3-n;
Fr.Month:=month; Fr.Year:=year;
if n<5 then Fr.Day:=LastDay.Day-(n+2)
else
if n=3 then Fr.Day:=LastDay.Day
else Fr.Day:=LastDay.Day-1
end;
var
Wd,Fr:Date;
ff,mf:Text;
m:integer;
begin
Assign(ff,'father.txt'); Rewrite(ff);
Assign(mf,'mother.txt'); Rewrite(mf);
// Сентябрь-декабрь 2015 года
for m:=9 to 12 do begin
LastDays(m,2015,Wd,Fr);
if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2015 - 1 класс')
else Writeln(ff,Wd.Day,'.',m,'.2015 - 1 класс');
if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2015 - 5 класс')
else Writeln(ff,Fr.Day,'.',m,'.2015 - 5 класс')
end;
// Январь - май 2016 года
for m:=1 to 5 do begin
LastDays(m,2016,Wd,Fr);
if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2016 - 1 класс')
else Writeln(ff,Wd.Day,'.',m,'.2016 - 1 класс');
if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2016 - 5 класс')
else Writeln(ff,Fr.Day,'.',m,'.2016 - 5 класс')
end;
Close(ff); Close(mf)
end.
Содержимое выходных файлов:
father.txt
30.9.2015 - 1 класс
28.10.2015 - 1 класс
30.10.2015 - 5 класс
30.12.2015 - 1 класс
24.2.2016 - 1 класс
26.2.2016 - 5 класс
30.3.2016 - 1 класс
mother.txt
25.9.2015 - 5 класс
25.11.2015 - 1 класс
27.11.2015 - 5 класс
25.12.2015 - 5 класс
27.1.2016 - 1 класс
29.1.2016 - 5 класс
25.3.2016 - 5 класс
27.4.2016 - 1 класс
29.4.2016 - 5 класс
25.5.2016 - 1 класс
27.5.2016 - 5 класс