Разработка средств для работы с векторной графикой

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.08.2018
Размер файла 2,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

SimpleWindow(){super("Пробноеокно");

setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();

panel.setLayout(new GridLayout(2,3,5,10));

panel.add(new JButton("Кнопка"));

panel.add(new JButton("+"));

panel.add(new JButton("-"));

panel.add(new JButton("Кнопка с длинной надписью"));

panel.add(new JButton("ещекнопка"));

setContentPane(panel);setSize(250, 100);}

Рис 3.5 - Применение GridLayout

Менеджер BoxLayout размещает элементы на панели в строку или в столбец.

Обычно для работы с этим менеджером используют вспомогательный класс Box, представляющий собой панель, для которой уже настроено блочное размещение Создается такая панель не конструктором, а одним из двух статических методов, определенных в классеBox: createHorizontalBox()иcreateVerticalBox().

Элементы, добавленные на панель с блочным размещением, выстраиваются один за другим Расстояние между элементами по умолчанию нулевое Однако вместо компонента можно добавить невидимую «распорку», единственная задача которой -- раздвигать соседние элементы, обеспечивая между ними заданное расстояние Горизонтальная распорка создается статическим методом createHorizontalStrut(intwidth), а вертикальная -- методом createVerticalStrut(intheight) Оба метода определены в классе Box, а целочисленный параметр в каждом из них определяет размер распорки.

Кроме того, на такую панель можно добавить еще один специальный элемент -- своеобразную «пружину» Если размер панели будет больше, чем необходимо для оптимального размещения всех элементов, те из них, которые способны растягиваться, будут стараться заполнить дополнительное пространство собой Если же разместить среди элементов одну или несколько «пружин», дополнительное свободное пространство будет распределяться и в эти промежутки между элементами Горизонтальная и вертикальная пружины создаются соответственно методами create Horizonta lGlue( )иcreateVerticalGlue().

Понять особенности работы этого менеджера лучше на наглядном примере Мы расположим четыре кнопки вертикально, поставив между двумя центральными «пружину», а между остальными -- распорки в 10 пикселов.

SimpleWindow(){super("Пробноеокно");

setDefaultCloseOperation(EXIT_ON_CLOSE);

Box box = Box.createVerticalBox();

box.add(new JButton("Кнопка"));

box.add(Box.createVerticalStrut(10));

box.add(new JButton("+"));

box.add(Box.createVerticalGlue());

box.add(new JButton("-"));

box.add(Box.createVerticalStrut(10));

box.add(new JButton("Кнопка с длиннойнадписью"));

setContentPane(box);

setSize(250, 100);}

Рис 3.6 - Применение BoxLayout

В примере с вертикальной панелью все кнопки оказались выровнены по левому краю Такое выравнивание по горизонтали принято по умолчанию.

Однако при разработке окна программы может понадобиться, чтобы какие-то элементы были выровнены иначе, например, по правому краю или по центру Для того, чтобы установить выравнивание любого визуального компонента (например, кнопки или панели), используются методы setAlignmentX(floatalignment) -- выравнивание по горизонтали и setAlignmentY(floatalignment) -- выравнивание по вертикали В качестве параметра проще всего использовать константы, определенные в классе JComponent Для выравнивания по горизонтали служат константы LEFT_ALIGNMENT (по левому краю), RIGHT_ALIGNMENT (по правому краю) и CENTER_ALIGNMENT (по центру) Для выравнивания по вертикали -- BOTTOM_ALIGNMENT (по нижнему краю), TOP_ALIGNMENT (по верхнему краю) и CENTER_ALIGNMENT (по центру).

Однако выравнивание работает несколько иначе, чем ожидается Чтобы это обнаружить, изменим предыдущий пример, выровняв третью кнопку по правому краю Для этого заменим строку:box.add(new JButton("-"));

На три других:

JButtonrightButton = newJButton("-");

rightButton.setAlignmentX(JComponent.RIGHT_ALIGNMENT);

box.add(rightButton);

Рис 3.7 - Применение выравнивания

Нам пришлось ввести переменную для обращения к этой кнопке, поскольку теперь нам нужно выполнить с ней не одно, а два действия: установка выравнивания по правому краю и добавление в панель Прежний прием -- одновременное создание кнопки и передача ее в качестве параметра в метод -- здесь не сработает.

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

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

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

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

Координаты элемента можно задать одним из следующих методов:

setLocation(int x, int y),

setLocation(Pointpoint)

Эти методы работают аналогично, устанавливая левый верхний угол элемента в точку с заданными координатами Разница в способе задания точки Можно представить точку двумя целыми числами, а можно объектом класса Point Класс Point по сути представляет собой ту же пару чисел, его конструктор имеет вид Point(int x, int y) Получить доступ к отдельной координате можно методами getX() и getY().

Можно задаться вопросом: зачем использовать класс Point, если можно просто передать пару чисел Дело в том, что многие полезные методы возвращают результат -- координаты некоторой точки -- в виде объекта этого класса Например, метод getLocation(), возвращающий координаты элемента Предположим, нам нужно поместить элемент b в точности в то место, которое занимает элемент a Этого легко добиться одной строкой:

b.setLocation(a.getLocation());

Размер элемента задается одним из двух методов:

setSize(int width, int height),

setSize(Dimensionsize)

Эти методы работают одинаково -- разница, как и в прошлый раз, в способе передачи параметра Класс Dimension, аналогично классу Point, просто хранит два числа, имеет конструктор с двумя параметрами: Dimension(intwidth, intheight) и позволяет получить доступ к своим составляющим -- ширине и высоте -- с помощью простых методов getWidth() и getHeigth() Для того, чтобы получить текущий размер элемента, можно воспользоваться методом getSize(), возвращающего объект класса Dimension Элемент b можно сделать точно такого же размера, как элемент a, выполнив команду: b.setSize(a.getSize());

Создадим панель, с которой не будет связано никакого менеджера размещения и вручную разместим на ней две кнопки:

SimpleWindow(){super("Пробноеокно");

setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();

panel.setLayout(null);

JButton button = new JButton("Кнопка");

button.setSize(80, 30);

button.setLocation(20,20);

panel.add(button);button = new JButton("Кнопка с длиннойнадписью");

button.setSize(120, 40);

button.setLocation(70,50);

panel.add(button);

setContentPane(panel);

setSize(250, 150);}

Рис 3.8 - Окно без управления менеджерами

Мы используем одну и ту же переменную button для обращения к обеим кнопкам (причем, второй раз ее описывать не нужно) В самом деле, осуществив все необходимые операции с первой кнопкой и зная, что обращаться к ней нам больше не понадобится, мы используем «освободившуюся» переменную для манипуляций со второй.

Если у панели есть любой менеджер размещения, она игнорирует явно заданные размеры и координаты всех своих элементов В этом легко убедиться, заменив в предыдущем примере команду panel.setLayout(null) на panel.setLayout(new FlowLayout()) Менеджер размещения сам определяет координаты и размеры всех элементов.

Способ определения координат элементов очевидным образом вытекает из алгоритмов работы каждого менеджера и, таким образом, детально рассмотрен нами выше.

Мы также отмечали, что в некоторых случаях компоненты стараются заполнить все доступное им пространство Например, всю центральную область в случае менеджера BorderLayout или всю ячейку в менеджере GridLayout А в панели с менеджером FlowLayout, напротив, элементы никогда не пытаются выйти за определенные границы Рассмотрим, что это за границы.

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

getMinimumSize(),

getPreferredSize(),

getMaximumSize().

Методы возвращают результат типа Dimension Они запрограммированы в соответствующем классе Например, у кнопки минимальный размер -- нулевой, максимальный размер не ограничен, а предпочтительный зависит от надписи на кнопке (вычисляется как размер текста надписи плюс размеры полей).

Менеджер FlowLayout всегда устанавливает предпочтительные размеры элементов Менеджер BorderLayout устанавливает предпочтительную ширину правого и левого, а также предпочтительную высоту верхнего и нижнего Остальные размеры подгоняются под доступное пространство панели Менеджер GridLayout пытается подогнать размеры всех элементов под размер ячеек Менеджер BoxLayout ориентируется на предпочтительные размеры.

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

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

setMinimumSize(Dimension size),

setPreferredSize(Dimension size),

setMaximumSize(Dimension size).

Чаще всего используется простой прием, когда элементу «не рекомендуется» увеличиваться или уменьшаться относительно своих предпочтительных размеров Это легко сделать командой:element.setMinimumSize(element.getPreferredSize());

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

Безусловно, наиболее подходящим будет вариант, при котором все элементы окна имеют предпочтительные размеры или близкие к ним*.

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

Когда панели служат не просто для размещения элементов в соответствии с алгоритмом некоторого менеджера, а для визуального отделения их друг от друга, они оформляются с помощью рамок.

Рамка панели устанавливается методом setBorder(Borderborder) Параметром метода выступает рамка -- объект класса Border Это абстрактный класс, поэтому для создания рамки используются его наследники:

EmptyBorder -- пустая рамка, позволяет создать отступы вокруг панели Размеры отступов задаются в конструкторе четырьмя целыми числами.

TitledBorder -- рамка с заголовком Простейший конструктор имеет один параметр типа String (текст заголовка) Заголовок может размещаться вдоль любой стороны рамки, иметь различные начертания.

EtchedBorder -- рамка с тиснением Может быть вогнутой или выпуклой.

BevelBorder -- объемная рамка (выпуклая или вогнутая) Можно настроить цвета, требуемые для получения объемных эффектов.

SoftBevelBorder -- то же самое, что BevelBorder, но позволяет дополнительно скруглить углы.

LineBorder -- простая рамка, нарисованная сплошной линией Можно выбирать цвет и толщину линии, скруглить углы.

MatteBorder -- рамка из повторяющегося рисунка.

CompoundBorder -- объединяет две рамки, передаваемые в качестве параметров конструктору в одну новую рамку.

Все перечисленные классы описаны в пакете javax.swing.border.

Метод createPanel() создает панель с кнопкой во весь свой размер В качестве параметра передается надпись на кнопке и рамка, которую необходимо добавить к панели Рамка добавляется не напрямую, а путем композиции с пустой рамкой Этот прием часто используется, чтобы рамка не прилипала к краю панели.

Этот пример показывает, с помощью каких конструкторов создаются различные рамки и как они выглядят В нем использованы два новых класса: Color и ImageIcon.

Класс Color предназначен для работы с цветом В нем есть несколько констант, описывающих наиболее распространенные цвета В частности, к таковым относится Color.ORANGE.

Класс ImageIcon описывает графическое изображение Параметр его конструктора -- это путь к файлу, из которого изображение может быть загружено В примере используется относительное имя файла «1.gif» Чтобы объект ImageIcon был успешно создан, файл с таким именем должен быть помещен в папку проекта.

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

3.6 Проектирование и реализациярешения

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

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

Рис 3.9 - Диаграмма проекта

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

Пакет modelсодержит классы, реализующие работу с клиентом, обработку координат, работу с аккаунтами, и т.д

Рис 3.10 - Диаграмма пакета demo

Пакет geolocationсодержит классы, обрабатывающие информацию о местоположении объекта непосредственно от клиента

Рис 3.11 - Диаграмма пакета svg

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

Следует отметить также и следующее Как было сказано, разработка подчиняется некоторым стандартам Java, один из которых - JavaCodeConventions Стандарт определяет правила написания кода: отступы, количество строк в методах, переносы, а также правила именования методов, классов, полей Подразумевается, что именование должно однозначно говорить, каккую логику реализует метод, для чего нужно поле, что представляет из себя класс По этой причине отсутствует явная необходимость пояснять каждый метод и класс в отдельности, т.к из названий становится понятно, какой класс за что отвечает, какими свойствами и поведением обладает: достаточно только привести диаграмму с имеющимися полями и методами.

Итак, в результате указанные выше пакеты и классы были реализованы в соответствии с теми требованиями которые были предъявлены Нецелесообразно приводить все классы и методы в них, рассмотрим с небольшими пояснениями лишь некоторые.

Отметим, что для ознакомления с полным перечнем классов, пакетов и методов был сгенерирован Javadocпо всему проекту

Ниже на рис.3.12 - 3.23 приведены UML-диаграммы классов с реализованными методами.

Рис 3.12 - Диаграмма класса SVGGraphicsDevice.

Рис 3.13 - Диаграмма классаSVGGraphicsConfiguration

Рис 3.14 - Диаграмма классаStandartFontMapper

Рис 3.15 - Диаграмма классаImageElement

Рис 3.16 - Диаграмма интерфейса FontMapper

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

Рис 3.17 - Диаграмма класса SVGHints

Рис 3.18 - Диаграмма классаSVGUtils

Рис 3.19 - Диаграмма PreserveAspectRatio

Рис 3.20 - Диаграмма классаViewBox

Рис 3.21 - Диаграмма классаMeetOrSlice

Рис 3.22 - Диаграмма класса SVGUtils

Рис 3.23 - Диаграмма демо-классов

На этом рассмотрение классов и пакетов, описание разработки и инструментов завершено.

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

Метод, выполняющий пример на рис 3.24 приведен ниже:

private static void drawLinearGradientPaintTest(Graphics2D g2) {

// top left

LinearGradientPaintlgp = new LinearGradientPaint(10, 30, 50, 30, new float[] {0.0f, 1.0f}, new Color[] {Color.RED, Color.BLUE});

g2.setPaint(lgp);

g2.fill(new Rectangle2D.Double(10, 10, 40, 40));

// top right

lgp = new LinearGradientPaint(80, 10, 80, 50, new float[] {0.0f, 1.0f}, new Color[] {Color.RED, Color.BLUE});

g2.setPaint(lgp);

g2.fill(new Rectangle2D.Double(60, 10, 40, 40));

// bottom left

lgp = new LinearGradientPaint(10, 100, 50, 60, new float[] {0.0f, 1.0f}, new Color[] {Color.RED, Color.BLUE});

g2.setPaint(lgp);

g2.fill(new Rectangle2D.Double(10, 60, 40, 40));

// bottom right

lgp = new LinearGradientPaint(70, 70, 90, 90, new float[] {0.0f, 0.5f, 1.0f}, new Color[] {Color.RED, Color.YELLOW, Color.BLUE}, CycleMethod.REPEAT);

g2.setPaint(lgp);

g2.fill(new Rectangle2D.Double(60, 60, 40, 40));

}

Рис 3.24 - Скриншот создания векторного изображения

Далее приведем код, который выполняет сохранение дизайна формы в SVG:

publicSwingUIToSVGDemo(String title) {

super(title);

add(createContent());

}

privateJComponentcreateContent() {

JPanel content = new JPanel(new BorderLayout());

JTabbedPane tabs = new JTabbedPane();

tabs.add("Tab 1", new JButton("First Tab"));

tabs.add("Tab 2", new JButton("Second Tab"));

JButton button = new JButton("Save to SVG");

button.addActionListener(this);

content.add(tabs);

content.add(button, BorderLayout.SOUTH);

return content;

}

@Override

public void actionPerformed(ActionEvent e) {

JComponent c = (JComponent) getContentPane().getComponent(0);

SVGGraphics2D g2 = new SVGGraphics2D(c.getWidth(), c.getHeight());

c.paint(g2);

File f = new File("SwingUIToSVGDemo.svg");

try {

SVGUtils.writeToSVG(f, g2.getSVGElement());

} catch (IOException ex) {

System.err.println(ex);

}

}

public static void main(String[] args) {

try {

for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (Exception e) {

// just take the default look and feel

}

SwingUIToSVGDemo app = new SwingUIToSVGDemo("SwingUIToSVGDemo.java");

app.pack();

app.setVisible(true);

}

Рис 3.25 - Скриншот окна, экспортированного в SVG

Заключение

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

Были выполнены описанные требования:

Спроектировать архитектуру библиотеки;

Выбрать инструменты и методы реализации на языке Java;

Генерация векторных элементов при построении изображения

Векторизация растрового формата в векторный

Экспорт векторного формата в растровый

Сохранение дизайна графического интерфейса приложений на Java в растровый или векторный формат для использования в процессе описания ПО или разработке дизайна приложений

Обеспечить встраиваемость библиотеки в приложения на Java, предназначенные для выполнения на мобильных устройствах

Не использовать платформозависимые механизмы Java

Иные возможности на усмотрение разработчика;

В процессе проектирования и разработки библиотеки были исследованы способы работы с процессами в различных операционных системах, проведен обзор предметной области, освоена работа с библиотекой для тестирования JUnit, были разработаны соответствующие классы и интерфейсы

Разработанная библиотека соответствует поставленным требованиям, выполнено в соответствии со стандартами разработки на языке Java, с соблюдением правил написания кода и стандартов именования объектов

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

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

Размещено на Allbest.ru


Подобные документы

  • Построение 3D моделей на основе векторных 2D аналогов. Преобразование объектов векторной и 3D графики в растровые. Перенос векторных и растровых изображений в документы MS Word. Создание учебного чертёжного документа с растровым изображением детали.

    контрольная работа [1,5 M], добавлен 14.01.2015

  • Характеристика программы векторной графики CorelDRAW 12, ее новые возможности, дополнительные функции и инструменты. Специфика векторных и растровых изображений. Требования к компьютеру, рабочая среда и элементы интерфейса. Работа с файлами и их форматы.

    учебное пособие [49,6 K], добавлен 18.11.2009

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

    контрольная работа [22,9 K], добавлен 16.09.2010

  • Виды компьютерной графики. Photoshop – программа для создания и обработки растровой графики. Пакет программ для работы с векторной графикой CorelDraw. Обработка растровых изображений с использованием Photoshop. Этапы создания коллажа на тему "Музыка".

    курсовая работа [2,3 M], добавлен 27.12.2014

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

    презентация [25,2 K], добавлен 06.01.2014

  • Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Основные понятия и задачи, решаемые компьютерной графикой. Характеристика и разновидности компьютерной графики. Цветовые модели RGB, CMYK, HSB. Графические форматы растровых и векторных изображений. Особенности шелкографии, трёхмерная графика и анимация.

    курсовая работа [350,7 K], добавлен 20.02.2012

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

    курсовая работа [1,7 M], добавлен 27.01.2015

  • Общие сведения о графических редакторах, понятия компьютерной растровой и векторной графики, форматов. Обзор и сравнительный анализ современных программ обработки и просмотра графических изображений: Paint, Corel Draw, Adobe Photoshop, MS PowerPoint.

    дипломная работа [283,9 K], добавлен 09.08.2010

  • Преимущества векторных изображений. Описание работы с программой создания графических изображений - Illustrator. Метод создания кривых с помощью четырех точек для криволинейного сегмента. Создание контуров с помощь инструмента "Перо". Работа с масками.

    контрольная работа [575,8 K], добавлен 11.09.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.