Операции с фрагментами изображений. Растровые шрифты 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операции с фрагментами изображений. Растровые шрифты



Обработка изображений может сопровождаться с необходимостью выполнения операций с отдельными их частями - фрагментами, которые могут сохраняться в памяти, а затем воспроизводиться на экране. Такие задачи возникают при построении динамических изображений, в игровых программах, мультипликации и в других случаях. Эти операции возможны и с текстовой информацией. Выполнить их можно процедурами GetImage и PutImage. Обычно, для простоты операций, фрагменты выбирают прямоугольной формы и задают их координатами вершин, расположенных по диагонали.

Сохранение прямоугольного фрагмента в памяти выполняется путем запоминания его размеров и значения яркости каждой точки фрагмента. Такой фрагмент можно запоминать, последовательно считывая значения яркости всех точек с помощью процедуры GetImage.

Воспроизведение записанного фрагмента выполняется аналогично через процедуру PutPixel. При этом следует учитывать размеры фрагмента и область вывода так, чтобы он не выходил за границы экрана. Описанный метод обработки фрагментов изображения является недостаточно эффективным из-за того, что каждая точка экрана для сохранения требует одного байта памяти, а также из-за выполнения большого числа обращений к процедурам GetPixel и PutPixel. Каждое такое обращение к названным процедурам содержит операции вычисления адресов видеопамяти и является достаточно сложным по числу вычислений.

Более эффективным методом является способ сохранения фрагмента изображения в виде массива строк, каждая из которых имеет структуру строк видеопамяти, т.е. каждой точке соответствует один бит памяти, а строки записываются в последовательность байт. Для сохранения одной строки черно-белого изображения требуется k байт памяти:

k = ((xmax - xmin + 1) + 7) div 8 = (xmax - xmin) div 8 + 1.

Рассмотрим операцию копирования упакованных строк фрагмента. Вводятся упакованные строки источника и приемника.

LS: array[ ] of byte; {строка-источник}

LD: array[ ] of byte; {строка-приемник}

В общем случае требуется скопировать биты строки LS, начиная с номера XS1 и кончая номером XS2, в биты строки LD, начиная с номера XD1 и кончая номером XD2 (рис. 1.16).

XS1 XS2

 


LS

 

 


LD

XD1 XD2

Рис. 1.16

Задача решается эффективно при копировании группами бит, упакованных в байты. Процедура выполняется с использованием операций маскирования и сдвига.

Хранение и отображение на экране литер может быть выполнено двумя методами - растровым и векторным. При растровом методе литеры представляются в виде фрагментов образов фиксированного размера. Вывод этих образов на экран возможно процедурой аналогичной процедуре PutImage. Полный набор символов хранится обычно в одном файле, в котором литеры расположены последовательно одна за другой. Для выбора необходимого символа по его коду определяется местоположение образа, который выводится в требуемую точку экрана. Размеры литер могут быть стандартными (стандарт IBM) 8 х 8, 8 х 14, 9 х 16 или произвольного формата. На рис. 1.17 показаны примеры символов, представленных на растре. Каждый символ в данном примере, включая межстрочные и межбуквенные интервалы, изображен на матрице 8 х 8.

Каждый символ кодируется 8 байтами (восемь строк по восемь бит). Например, для символа “А” двоичные строки выглядят следующим образом:

00010000; 00101000; 00101000; 01000100; 01111100; 10000010; 10000010; 00000000.

Эти биты, упакованные в шестнадцатеричный код, имеют вид: 10; 28; 28; 44; 7C; 82; 82; 00. Таким образом можно сформировать файл, хранящий все необходимые символы в шестнадцатеричном виде. По номеру символа можно находить требуемый символ в файле.

Векторный метод формирования символов заключается в построении процедуры вычерчивания отрезков (векторов), составляющих изображение символа. При этом используются процедуры MoveTo, LineTo и другие.

Растровые шрифты легче формировать и редактировать. Однако они хуже поддаются масштабированию, так как при этом возникает “лестничный эффект”. Поэтому для использования больших размеров символов, требуется хранение специально изготовленных шрифтов. Векторные шрифты масштабируются без заметных дефектов.

 

Двумерные преобразования в декартовых и однородных координатах

Перенос точки (x, y) относительно начала координат в точку (x*, y*) математически может быть записан следующим образом:

x* = x + Dx;

y* = y + Dy.

В векторной форме это преобразование имеет вид P * = P + T,

где P = [x y], P* = [x* y*], T = [Dx Dy]. Результаты переноса точки проиллюстрированы на рис. 2.1.

Масштабирование точки может выполняться относительно начала координат по обеим осям - X и Y через коэффициенты масштабирования Sx и Sy. Координаты точки после масштабирования определяются в соответствии с выражениями

x* = x ž Sx,

y* = y ž Sy

или в векторной форме

P * = P ž S, где S = .

Поворот точки на угол j относительно начала координат (рис. 2.2) выполняется следующими соотношениями:

x* = x ž Cos j - y ž Sin j,

y* = x ž Sin j + y ž Cos j.

 

В векторной форме преобразование имеет вид

P * = P ž R, где R = .

Рассмотренные элементарные преобразования и их композиции в компьютерной графике обычно выполняются в однородных координатах, обладающих тем свойством, что определяемый ими объект не меняется при умножении всех координат на одно и то же число. Введение однородных координат позволяет унифицировать все элементарные преобразования, которые получаются с использованием только операции умножения.

В однородных координатах точка P(x, y) записывается как трехкомпонентный вектор с некоторым произвольным масштабным множителем W ¹ 0: P(X, Y, W). Связь декартовых и однородных координат устанавливается следующим образом:

x = X/W, y = Y/W.

Обычно удобно использовать множитель W = 1. Тогда соотношение декартовых и однородных координат выглядит совсем просто: x = X, y = Y, а запись точки в однородных координатах имеет вид P(X, Y, 1). Элементарные преобразования в однородных координатах математически будут выглядеть следующим образом.

Обозначим исходную точку P вектором P = [x y 1], тогда преобразованную точку запишем как P * = [x* y* 1]. Преобразование переноса точки в однородных координатах можно выразить как

P * = P ž T,

где

T (Dx, Dy) = .

 

 

Преобразование масштабирования точки в однородных координатах имеет вид

P * = P ž S,

где S (Sx, Sy) = .

Аналогично можно записать преобразование поворота точки в однородных координатах.

P * = P ž R,

где R (j) = .

 

Композиции двумерных преобразований в однородных координатах

В предыдущем подразделе рассматривались преобразования точки относительно начала координат. В качестве примера несложных композиций преобразований можно рассмотреть преобразования масштабирования и поворота относительно произвольной точки плоскости.

Пусть требуется выполнить масштабирование изображения относительно точки P(x,y). Это преобразование можно выполнить последовательностью следующих элементарных преобразований:

Перенос точки P(x,y) и изображения таким образом, чтобы точка P(x,y) совпала с началом системы координат;

Масштабирование изображения относительно начала координат;

Перенос точки P(x,y) с изображением в исходное положение.

Каждое из указанных элементарных преобразований изображения можно получить путем умножения на соответствующую матрицу преобразования. Результирующая матрица преобразования может быть получена перемножением всех матриц элементарных преобразований:

MS = T (-x, -y) ž S (Sx, Sy) ž T (x,y)=

.

Для преобразования всего изображения необходимо преобразовать каждую точку с помощью результирующей матрицы MS. Возможно, что преобразования можно упростить за счет вычисления только некоторых точек изображения, а остальные точки получить построением отрезков прямых или иным способом. Это возможно, так как здесь рассматриваются только аффинные преобразования, при которых прямые преобразуются в прямые, параллельные - в параллельные, пересекающиеся - в пересекающиеся.

Аналогично можно выполнить преобразование поворота относительно произвольной точки P(x,y). Результирующая матрица получается следующим образом:

MR = T (-x, -y) ž R (j) ž T (x, y) =

В более сложных случаях композиция преобразований может состоять из любого числа последовательных преобразований переноса, поворота и масштабирования. В этом случае результирующая матрица преобразования имеет характерные вид



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 131; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.192.3 (0.014 с.)