Обработка Изображений

ИНСТРУМЕНТЫ РИСОВАНИЯ ADOBE PHOTOSHOP CS5

Программа Adobe Photoshop CS5 предоставляет несколько инструментов для рисования и редактирования цвета изображений, в том числе две основных разнидности кистей (рис. 6.1). Инструменты рисования — добавляют цвет к изобрению, а инструменты редактирования — изменяют цвет областей изображения. Каждый из инструментов, кроме того, имеет большое количество параметров, корые расширяют возможности инструментов. Традиционными инструментами рисования, применяющими технологию мазков, являются  Brush (Кисть) и  Pencil (Карандаш). Под одной кнопкой (рис. 6.1, а) кроме этих инструментов скраются еще инструменты Color Replacement (Замена цвета) и Mixer Brush (Смивающая кисть).

Инструменты группы Gradient (Градиент), команда Fill (Заливка) из меню Edit(Редактирование) и инструмент Paint Bucket (Ведро с краской) предназначены для работы с цветом на больших площадях.

Такие инструменты, как Eraser (Ластик), Blur (Размытие) и Smudge (Палец), позволяют изменить существующие цвета в изображении.

а                                                               б

Рис. 6.1. Наборы инструментов рисования

Кроме того, к рисующим можно отнести инструмент Color Replacement (Зама цвета) и инструмент Art History Brush (Художественная кисть предыдущих стояний).

Каждый из инструментов имеет свои особые параметры и рисует по-разному в зависимости от размера и формы курсора. Параметры определяются в палитре Options(Параметры). На панели параметров для каждого инструмента можно нтроить цвета, применяемые к изображению, и выбрать нужные образцы кистей из заданных.

Работа со всеми инструментами этого типа весьма сходна. Инструменты рисания Brush(Кисть), Pencil (Карандаш) и Color Replacement (Замена цвета) иользуют для штриха основной цвет. Инструменты группы Eraser (Ластик) замяют существующий цвет пикселов изображения на другой. Наконец, инструмент Art History Brush (Художественная кисть предыдущих состояний) использует в работе цвета самого изображения.

Инструмент Brush

Инструмент Brush (Кисть) предназначен для создания линии заданной толщы. Это будет четкая или размытая линия, однако она всегда будет немного мягче, чем линия, нарисованная карандашом, поскольку ее края смешиваются с фоном. На рис. 6.2 показана палитра инструмента Brush (Кисть) и мазки, выполненные ктью размером 125 (первый), кистью того же размера, но с включенной функцией аэрографа (второй и четвертый), карандашом (третий) и кистью с перекрытием (пятый). Вид кисти выбирается из палитрыBrush Presets (Образцы кистей).

При печати получаются полутоновые точки, соответствующие переходам меу мазками кисти и окружающими их областями. Для создания штриха выбираюя диаметр и форма кисти в палитре Brush (Кисть). Photoshop предлагает множесо стандартных вариантов кистей, из которых можно выбрать подходящий образец кисти. При желании с жесткого диска можно загрузить другие формы кистей. Мние оригинальные образцы кистей доступны для скачивания из Интернета. Можно изменить настройки кисти Size (Размер) иHardness (Жесткость), чтобы создать новые эффекты (рис. 6.3).

Параметр Opacity (Непрозрачность) задает непрозрачность штрихов кисти. ПараметрFlow (Поток) используется в нескольких рисующих инструментах.

Его значение определяет непрозрачность каждой точки цвета, наносимой с помо-

щью инструмента. При наложении новой точки на уже существующую точка цвета становится более непрозрачной. Определенные значения параметра Flow (Поток) приводят к большему значению непрозрачности, чем аналогичные значения паретраOpacity (Непрозрачность), т. е. параметр Flow (Поток) приводит к нараающему эффекту при наложении мазков кисти на предыдущие мазки.

Рис. 6.2. Палитра инструмента Brush

и виды мазков различными кистями и карандашом

Airbrush (Распылитель краски) . Имитирует рисование аэрографом. При перемещении указателя мыши по области наносится краска до тех пор, пока кнопка мыши остается нажатой. Другие параметры контролируют как быстро краска нанится и в каких количествах. Нажмите кнопку, чтобы включить или отключить эту опцию.

Tablet pressure buttons (Кнопки планшетного давления)              — определт степень давления кисти для переопределения непрозрачности.

При рисовании кистью необходимо учитывать опцию Mode (Режим) — режим наложения пикселов фона и пикселов краски кисти, задавая его в палитре инстрента (рис. 6.4).

Несмотря на экстравагантную форму некоторых кистей, они применяются при работе в Photoshop. В комплект Photoshop также входит набор кистей Natural Brushes(Натуральные кисти), имитирующих различные художественные инстренты. Этот комплект поможет добиться естественного штриха при рисовании.

Рис. 6.3. Палитра инструмента кисти Brush

и способы задания диаметра и формы кисти

Комментариев: 0

интересно

Можно найти много полезной информации на моей страничке))

Комментариев: 0

Без заголовка

Комментариев: 0

Без заголовка

Комментариев: 0

Без заголовка

Комментариев: 0

Без заголовка

Комментариев: 0

Без заголовка

Комментариев: 0

3.1 Эквивалентность циклов.

Наверное самыми востребованными операторами на любых языках программирования являются циклы и условия. Их то мы и разберем. Все циклы и условия относиться к структурным операторам.Структурные операторы строятся из специальных зарезервированных слов, логических выражений и других операторов. Каждый такой оператор явно или не явно содержит одну или несколько логических проверок.И еще одно понятие, которое часто встречается в циклах и условиях – составной оператор.Составной оператор – это оператор вида:
Begin  line_1; 
line_2; 
line_n;
 End;
где операторы line_x, в свою очередь, могут быть простыми или составными операторами. Составной оператор трактуется как один оператор. Такая конструкция используется в ситуациях, когда, согласно формальным правилам языка, разрешается использование лишь одного оператора, а в действительности требуется несколько операторов.Цикл позволяет многократно выполнить некоторое множество действий, задаваемых операторами, составляющих его тело. В Паскале существует три вида циклов.Цикл с предусловием.Данный оператор имеет вид while условие do действие; При выполнение этого цикла вначале проверяется «условие», если значение выражение «истина», то выполняется «действие», и так до тех пор пока «условие» не примет значение «ложь». Если выражение «условие» принимает значение «ложь» изначально, то «действие» не выполняется вообще. В данной записи можно использовать составной оператор.Пример цикла с предусловием:
while counter < 100 do   
inc (counter);
Цикл с постусловиемДанный цикл имеет видrepeat действие until условие; Здесь в начале выполняется «действие», затем вычисляется логическое значение «условия». Процесс повторяется, пока «условие» равно «ложь». Так же можно в сегменте действие применить составной оператор, но можно его и не применять. Паскаль допускает использование нескольких простых операторов. Следующие два примера эквивалентны
.repeat  line_1;
  line_2; 
line_3;
until false;
repeat begin 
 line_1; 
 line_2; 
 line_3;
 end;
until false;
В этом цикле, в отличие от цикла while проверка условия проверяется в последнюю очередь и тело цикла выполняется хотя бы один раз при любом «условии».Цикл со счетчикомЗдесь два варианта циклов for…to...do и for…downto…doВ этом цикле участвует любая, обвяленная ранее скалярная переменная, называемая управляющей переменной цикла.Рассмотрим подробнее цикл 
for I := z1 to z2 do
I– Любая переменная.
z1,z2 – начальная и конечная точки счетчика цикла.
Здесь правильное условие z1<z2. z1=«z2»>z2 — не выполнится ни разу. Эти значения остаются неизменными в ходе выполнения всего цикла. Управляющая переменная последовательно увеличиваясь, пробегает все значения от z1 до z2.
И на оборот, для второго вида цикла.
for I := z1 downto z2 do
Здесь правильное условие z1>z2.
При z1=z2 цикл выполнится один раз, а при
z1<z2 :=«1»> 10 then x := 0;
Существует еще и полная версия оператора, которая имеет вид:
if условие then действие1 else действие2;
Выполняется следующим образом: Если «условие» равно истина, то выполняется «действие1», иначе выполняется «действие2».
Следует отметить, что между оператором «действие1» и else точка с запятой не ставиться.
Это приведет ошибке компиляции программы. Выражение «условие» также может быть составным. В этом случае каждая единица составного условия пишется в круглых скобках () и отделяется друг от друга булевыми операторами.
Напримерif (x>0) and (x < 10) then x := x+1;
Читаться так: Если икс больше нуля И икс меньше десяти, то …
Или такой пример:
 if (x<10) or (x > 20) then x := 15;
Читаться так: Если икс меньше десяти, ИЛИ икс больше двадцати, то …
Еще одна разновидность условного оператора case…of…end.Это оператор выбора
. Он имеет следующий вид:
case выражение of  значение_1: действие_1; значение_2: действие_2; … значение_Х: действие_Х; else: действие_Else;end;«выражение»,
возможно, принимает одно из «значений», находящихся слева от двоеточий, затем выполняется соответствующее действие.
Ветвь else, отвечающая всем не перечисленным «значениям» и не обязательна. В «выражении» оператора case допустимо применять переменные целого типа.
В нутрии оператора case … end допустимо применение составных операторов.
А теперь более конкретный пример.
Допустим переменная x принимает значение от 1 до 4 тогда:
case x of 1: begin
x:=2; break; end;
 2:begin x:=3; break;
end; 
3: begin x:=4; break; end;
 4: x:= 1;end;
Здесь используются как простые операторы, так и составные. Ветвь else вовсе не используется.

</z2.>
Комментариев: 0

5. Различие между одномерным и двумерным массивами.

Одномерные и двумерные массивы

Массив — это пронумерованная последовательность величин одинакового типа, обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом. Каждое из значений, составляющих массив, называется его компонентой (илиэлементом массива).

Массив данных в программе рассматривается как переменная структурированного типа. Массиву присваивается имя, посредством которого можно ссылаться как на массив данных в целом, так и на любую из его компонент.

Вообще, массив – однородный, упорядоченный структурированный тип данных с прямым доступом к элементам.

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

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

Пример: числовая последовательность четных натуральных чисел 2, 4, 6, ..., N представляет собой линейный массив, элементы которого можно обозначить А[1]=2, А[2]=4, А[3]=6, ..., А[К]=2*(К+1), где К — номер элемента, а 2, 4, 6, ..., N — значения. Индекс (порядковый номер элемента) записывается в квадратных скобках после имени массива.

Например, A[7] — седьмой элемент массива А; D[6] — шестой элемент массива D.

Для размещения массива в памяти ЭВМ отводится поле памяти, размер которого определяется типом, длиной и количеством компонент массива. В языке Pascal эта информация задается в разделе описаний. Массив описывается так:

имя массива : Array [тип индекса] Of базовый тип;

Чаще всего типом индекса является диапазон. Например,

Var B : Array [1..5] Of Real, R : Array [1..34] Of Char;

— описывается массив В, состоящий из 5 элементов и символьный массив R, состоящий из 34 элементов. Для массива В будет выделено 5*6=30 байт памяти, для массива R — 1*34=34 байта памяти.

 

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

Кроме того, массив можно объявить с использованием собственного типа:

Type mas = array[1..100] of integer;
	     mas_ = array[1..50] of real;
  Var a, b: mas;
      R: mas_;

Заполнить массив можно следующим образом:

1) с помощью оператора присваивания. Этот способ заполнения элементов массива особенно удобен, когда между элементами существует какая-либо зависимость, например, арифметическая или геометрическая прогрессии, или элементы связаны между собой рекуррентным соотношением.

Задача 1. Заполнить одномерный массив элементами, отвечающими следующему соотношению:

a1=1; a2=1; ai=ai-2+ai-1 (i = 3, 4, ..., n).

Read(N); {Ввод количества элементов}
A[1]:= 1;
A[2]:= 1;
FOR I := 3 TO N DO
     A[I] := A[I - 1] + A[I - 2];

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

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

Program Create;
Type Mas = Array[1..100] Of Integer;
Var A : Mas; I, J, N : Byte; Log : Boolean;
Begin
    Write(''); ReadLn(N);
    randomize; A[1] := -32768 + random(65535);
    For I := 2 To N Do
    Begin
        Log := True;
        Repeat
            A[i] := -32768 + random(65535); J := 1;
            While Log and (j <= i - 1) Do
            begin Log := a[i] <> a[j]; j := j + 1 End
        Until Log
    End;
    For i := 1 to N Do Write(a[i]:7); writeln
End.

2) ввод значений элементов массива с клавиатуры используется обычно тогда, когда между элементами не наблюдается никакой зависимости. Например, последовательность чисел 1, 2, -5, 6, -111, 0 может быть введена в память следующим образом:

Program Vvod;
 Var N, I : Integer;
     A : Array [1..20] Of Integer;
Begin
  Write('Введите количество элементов массива ');  ReadLn(N);
  FOR I := 1 TO N DO
  Begin
   Write('Введите A[', I, '] '); ReadLn(A[I])
End.

Над элементами массивами чаще всего выполняются такие действия, как

а) поиск значений;

б) сортировка элементов в порядке возрастания или убывания;

в) подсчет элементов в массиве, удовлетворяющих заданному условию.

Сумму элементов массива можно подсчитать по формуле S=S+A[I] первоначально задав S=0. Количество элементов массива можно подсчитать по формуле К=К+1, первоначально задав К=0. Произведение элементов массива можно подсчитать по формуле P = P * A[I], первоначально задав P = 1.

 

 

Если два массива являются массивами эквивалентных типов, то возможно присваивание одного массива другому. При этом все компоненты присваиваемого массива копируются в тот массив, которому присваивается значение. Типы массивов будут эквивалентными, если эти массивы описываются совместно или описываются идентификатором одного и того же типа. Например, в описании

Type Massiv = Array[1..10] Of Real;
Var A, B : Massiv; C, D : Array[1..10] Of Real; E : Array[1..10] Of Real;

типы переменных A, B эквивалентны, и поэтому данные переменные совместимы по присваиванию; тип переменных C, D также один и тот же, и поэтому данные переменные также совместны по присваиванию. Но тип переменных C, D не эквивалентен типам переменных A, B, E, поэтому, например, A и D не совместны по присваиванию. Эти особенности необходимо учитывать при работе с массивами.

 

 

При работе с массивами целесообразно использовать процедуры и функции. Вот типовые процедуры:

Type mas = array[1..100] of LongInt;
{Заполнение массива с помощью ввода с клавиатуры}
Procedure Vvod_Kl(var n: byte; var a: mas);
Var i: byte;
Begin
	Write(‘Количество элементов?&rsquo '  ); Readln(n);
	For i := 1 to n do
		Begin
			write(i, ‘-й элемент&rsquo '  ); readln(a[i])
End
End;
{Заполнение массива случайными данными}
Procedure Vvod_Sl(var n: byte; var a: mas);
Var i: byte;
Begin
	Write(‘Количество элементов?&rsquo '  ); Readln(n);
For i := 1 to n do
		a[i] := -1000+random(2001)
End;
{Вывод массива}
Procedure Print(n: byte; const a: mas);
Var i: byte;
Begin
	For i := 1 to n do
		write(a[i] :8);
	writeln
End;

 

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

Например, данные о планетах Солнечной системы представлены следующей таблицей:

ПланетаРасст. до СолнцаОтнос. обьемОтнос. масса
Меркурий57.90.060.05
Венера108.20.920.81
Земля149.61.001.00
Марс227.90.150.11
Юпитер978.31345.00318.40
Сатурн1429.3767.0095.20

Их можно занести в память компьютера, используя понятие двумерного массива. Положение элемента в массиве определяется двумя индексами. Они показывают номер строки и номер столбца. Индексы разделяются запятой. Например: A[7, 6], D[56, 47].

Заполняется двумерный массив аналогично одномерному: с клавиатуры, с помощью оператора присваивания.

 

При описании массива задается требуемый объем памяти под двумерный массив, указываются имя массива и в квадратных скобках диапазоны изменения индексов.

При выполнении инженерных и математических расчетов часто используются переменные более чем с двумя индексами. При решении задач на ЭВМ такие переменные представляются как компоненты соответственно трех-, четырехмерных массивов и т.д.

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

Комментариев: 0

4. Подпрограммы.

Подпрограммы

Подпрограммы нужны для того, чтобы упростить структуру программы и облегчить ее отладку. В виде подпрограмм оформляются логические законченные части программы.

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

В Паскале два вида подпрограмм: процедуры и функции. Они имеют незначительные отличия в синтаксисе и правилах вызова. Процедуры и функции описываются в соответствующих разделах описания, до начала блока исполняемых операторов.

Само по себе описание не приводит к выполнению подпрограммы. Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов записывается в том месте программы, где требуется получить результаты работы подпрограммы. Подпрограмма вызывается по имени, за которым следует список аргументов в круглых скобках. Если аргументов нет, скобки не нужны. Список аргументов при вызове как бы накладывается на список параметров, поэтому они должны попарно соответствовать друг другу.

Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например:

inc(i); writeln(a, b, c);   { вызовы процедур }
y := sin(x) + 1;            { вызов функции }
  

Внутри подпрограмм можно описывать другие подпрограммы. Они доступны только из той подпрограммы, в которой они описаны. Рассмотрим правила описания подпрограмм.

Процедуры

Структура процедуры аналогична структуре основной программы:

procedure имя [(список параметров)];      { заголовок }
   разделы описаний
begin
   раздел операторов
end;
  
Пример 1

Найти разность средних арифметических значений двух вещественных массивов из 10 элементов.

Как видно из условия, для двух массивов требуется найти одну и ту же величину — среднее арифметическое. Следовательно, логичным будет оформить его нахождение в виде подпрограммы, которая сможет работать с разными массивами.

program dif_average;
const n = 10;
type mas = array[1 .. n] of real;
var  a, b : mas;
     i : integer;
     dif, av_a, av_b : real;

procedure average(x : mas; var av : real);       {1}
     var i : integer;
     begin
        av := 0;
        for i := 1 to n do av := av + x[i];
            av := av / n;
        end;                                     {2}

begin
    for i := 1 to n do read(a[i]);
    for i := 1 to n do read(b[i]);
    average(a, av_a);                            {3}
    average(b, av_b);                            {4}
    dif := av_a - av_b;
    writeln('Разность значений ', dif:6:2)
end.

         

Описание процедуры average расположено в строках с {1} по {2}. В строках, помеченных цифрами {3} и {4}, эта процедура вызывается сначала для обработки массива а, затем — массива b. Эти массивы передаются а качестве аргументов. Результат вычисления среднего арифметического возвращается в главную программу через второй параметр процедуры.

Функции

Описание функции отличается от описания процедуры незначительно:

function имя [(список параметров)] : тип; { заголовок }
   разделы описаний
begin
   раздел операторов
   имя := выражение;
end;
   

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

Пример 2

Найти разность средних арифметических значений двух вещественных массивов из 10 элементов.

program dif_average1;
const n = 3;
type mas = array[1 .. n] of real;
var
   a, b : mas;
   i    : integer;
   dif  : real;

function average(x : mas) : real;                         {1}
   var i  : integer;                                      {2}
       av : real;
   begin
       av := 0;
       for i := 1 to n do av := av + x[i];
       average := av / n;                                 {3}
   end;

begin
   for i := 1 to n do read(a[i]);
   for i := 1 to n do read(b[i]);
   dif := average(a) - average(b);                        {4}
   writeln('Разность значений ', dif:6:2)
end.
         

Оператор, помеченный комментарием {1}, представляет собой заголовок функции. Тип функции определен как вещественный, потому что такой тип имеет среднее арифметическое элементов вещественного массива. Оператор {3} присваивает вычисленное значение имени функции. В операторе {4} функция вызывается дважды: сначала для одного массива, затем для другого.

Глобальные и локальные переменные

В IBM PC-совместимых компьютерах память условно разделена на так называемые сегменты. Адрес каждого байта составляется из номера сегмента и смещения относительно его начала.

Длина адресов сегмента и смещения — 16 бит, поэтому размер сегмента не может превышать 216 байт (64K). При вычислении адреса байта в оперативной памяти адрес сегмента сдвигается на 4 двоичных разряда влево, и к нему прибавляется смещение (рис. 1). Таким образом, длина адреса составляет 20 бит, и с помощью него можно адресовать память объемом 220 байт (1 мегабайт).

Рис. 1

Компилятор Паскаля формирует сегмент кода, в котором хранится программа в виде машинных команд, сегмент данных, в котором выделяется память под глобальные переменные программы, и сегмент стека, предназначенный для размещения локальных переменных во время выполнения программы (рис. 2).

Рис. 2

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

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

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

 

ВНИМАНИЕ Подпрограмму надо писать таким образом, чтобы вся необходимая для ее использования информация содержалась в ее заголовке.

Комментариев: 0
Страницы: 1 2
Ксюша Г.
Ксюша Г.
Было на сайте никогда
21 год (02.01.1997)
Читателей: 4 Опыт: 0 Карма: 1
все 1 Мои друзья