Код программы графического редактора

Use saved searches to filter your results more quickly

Cancel Create saved search

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window.

Reload to refresh your session.

Simple graphics editor.

N0menIllisLegio/graphics-editor

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

C# .NET Windows Form | СОЗДАЁМ PAINT НА C#

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Задания к лабораторным работам

1. Ознакомление с концепциями ООП: наследование и полиморфизм типов (виртуальные методы)

  • Построить иерархию классов для вывода графических фигур: отрезок, прямоугольник, эллипс и т.д. — не менее 6 фигур.
  • Распределить классы по модулям. Создать список фигур в виде отдельного класса.
  • В главном модуле программы добавить в список различные фигуры (статическая инициализация), после чего запустить рисование списка фигур.
  • Выполнить задание на языке C++/C#.
  • Для рисования использовать любую подходящую графическую библиотеку.

2. Графический редактор

  • Расширить пример с графическими фигурами так, чтобы фигуры можно было создавать на уровне пользовательского интерфейса.
  • Существуют несколько способов: ввод координат с помощью мыши, диалоговый ввод значений, ввод на скриптовом языке. Студент может выбрать любой способ ввода.
  • Создание объекта должно выполняться так, чтобы добавление нового класса в систему не требовало изменения существующего кода (выбор типа с помощью оператора case / switch и множественного if делать нельзя).
  • Классы фигур не должны содержать метод рисования.
  • Получившаяся программа должна представлять собой примитивный графический редактор.

3. Сериализация объектов

Бесплатные Графические редакторы!!! Обзор Бесплатного Графического редактора Photo Montage Guide!!!

  • Реализовать сериализацию/десериализацию объектов из существующей иерархии классов в файл/из файла, формат сериализации определяется индивидуальным вариантом.
  • В пользовательском интерфейсе необходимо реализовать следующие функции:
    1. Возможность изменять свойства объектов (редактирование).
    2. Добавлять/удалять объекты из списка.
    3. Сериализация/десериализация списка объектов.
    4. Добавление новых классов в иерархию не должно приводить к необходимости переписать существующий код, не использовать if-else / switch , рефлексию.
    5. Варианты:
      1. XML
      2. Binary
      3. Text
      4. JSON
      5. BSON
      6. Номер варианта определяется по формуле: (порядковый_номер_в_группе % количество_вариантов) + 1.
      Читайте также:
      Какая нужна программа чтобы открыть файл zip

      4. Плагины — иерархия

      • Расширить имеющуюся иерархию новыми классами с помощью динамической загрузки модуля (плагина).
      • Новые модули должны добавлять или расширять функциональность базовой программы: новый класс в иерархии, функции по работе с ним, новые элементы в пользовательском интерфейсе для работы с новым классом.
      • Загружать модули можно из папки либо посредством строки-параметра в главном модуле с именем нового модуля и возможной перекомпиляцией. В идеале добавление нового модуля должно выполняться его динамической загрузкой, т.е. вообще не должно требовать изменения кода программы.
      • Разработать механизм подписывания плагинов.
      • Сделать подпись плагина с последующей проверкой базовой программой данной подписи на достоверность (время активации и целостность).

      5. Плагины — функциональность

      • На базе предыдущей лабораторной работы (№4) на основе плагинов (2-3 плагина) реализовать возможность обработки структур перед сохранением в файл и после загрузки из файла.
      • Тип обработки задаётся вариантом.
      • Дополнительная функциональность должна находиться в меню настроек и зависеть от загруженных плагинов. Загрузка плагинов производится автоматически из папки, либо выбором файла с плагином через пользовательский интерфейс.
      • Предусмотреть дополнительную настройку функциональности плагина в меню настройки плагинов. Например, заданием параметров шифрования/архивации, выбор алгоритма шифрования, дополнительные правила трансформации, кодировки и т.д.
      • Варианты:
        1. Трансформация XML данных в JSON
        2. Архивация
        3. Шифрование/дешифрование
        4. Трансформация XML (можно XSLI)
        5. Сохранение контрольной суммы
        • На базе предыдущей лабораторной работы (№5) обменяться с товарищем функциональными плагинами (минимум одним) и адаптировать их в этой же работе с помощью паттерна Адаптер (т.е. появятся новые функции от плагина товарища, загруженные через плагин с адаптером).
        • Также необходимо реализовать 2 паттерна (любых) в программе, пояснив уместность их использования.

        Источник: github.com

        Графический редактор

        В данной статье рассматривается создание простейшего графического редактора.

        Наш редактор будет обладать самым минимальным функционалом: карандаш, кисть, ластик, рисование простейших фигур (линия, прямоугольник, овал), выбор цвета. Выбор цвета как из минимального набора в цветовой панели, так и из расширенного набора цветов.

        Кроме того, можно будет загружать изображения, редактировать их и сохранять. Работа с изображениями в формате jpg и png.

        import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import javax.swing.event.*; import java.awt.image.*; import javax.imageio.*; import javax.swing.filechooser.FileFilter; public class ImageEdit < // Режим рисования int rezhim=0; int xPad; int xf; int yf; int yPad; int thickness; boolean pressed=false; // текущий цвет Color maincolor; MyFrame f; MyPanel japan; JButton colorbutton; JColorChooser tcc; // поверхность рисования BufferedImage imag; // если мы загружаем картинку boolean loading=false; String fileName; public ImageEdit() < f=new MyFrame(«Графический редактор»); f.setSize(350,350); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); maincolor=Color.black; JMenuBar menuBar = new JMenuBar(); f.setJMenuBar(menuBar); menuBar.setBounds(0,0,350,30); JMenu fileMenu = new JMenu(«Файл»); menuBar.add(fileMenu); Action loadAction = new AbstractAction(«Загрузить») < public void actionPerformed(ActionEvent event) < JFileChooser jf= new JFileChooser(); int result = jf.showOpenDialog(null); if(result==JFileChooser.APPROVE_OPTION) < try < // при выборе изображения подстраиваем размеры формы // и панели под размеры данного изображения fileName = jf.getSelectedFile().getAbsolutePath(); File iF= new File(fileName); jf.addChoosableFileFilter(new TextFileFilter(«.png»)); jf.addChoosableFileFilter(new TextFileFilter(«.jpg»)); imag = ImageIO.read(iF); loading=true; f.setSize(imag.getWidth()+40, imag.getWidth()+80); japan.setSize(imag.getWidth(), imag.getWidth()); japan.repaint(); >catch (FileNotFoundException ex) < JOptionPane.showMessageDialog(f, «Такого файла не существует»); >catch (IOException ex) < JOptionPane.showMessageDialog(f, «Исключение ввода-вывода»); >catch (Exception ex) < >> > >; JMenuItem loadMenu = new JMenuItem(loadAction); fileMenu.add(loadMenu); Action saveAction = new AbstractAction(«Сохранить») < public void actionPerformed(ActionEvent event) < try < JFileChooser jf= new JFileChooser(); // Создаем фильтры файлов TextFileFilter pngFilter = new TextFileFilter(«.png»); TextFileFilter jpgFilter = new TextFileFilter(«.jpg»); if(fileName==null) < // Добавляем фильтры jf.addChoosableFileFilter(pngFilter); jf.addChoosableFileFilter(jpgFilter); int result = jf.showSaveDialog(null); if(result==JFileChooser.APPROVE_OPTION) < fileName = jf.getSelectedFile().getAbsolutePath(); >> // Смотрим какой фильтр выбран if(jf.getFileFilter()==pngFilter) < ImageIO.write(imag, «png», new File(fileName+».png»)); >else < ImageIO.write(imag, «jpeg», new File(fileName+».jpg»)); >> catch(IOException ex) < JOptionPane.showMessageDialog(f, «Ошибка ввода-вывода»); >> >; JMenuItem saveMenu = new JMenuItem(saveAction); fileMenu.add(saveMenu); Action saveasAction = new AbstractAction(«Сохранить как. «) < public void actionPerformed(ActionEvent event) < try < JFileChooser jf= new JFileChooser(); // Создаем фильтры для файлов TextFileFilter pngFilter = new TextFileFilter(«.png»); TextFileFilter jpgFilter = new TextFileFilter(«.jpg»); // Добавляем фильтры jf.addChoosableFileFilter(pngFilter); jf.addChoosableFileFilter(jpgFilter); int result = jf.showSaveDialog(null); if(result==JFileChooser.APPROVE_OPTION) < fileName = jf.getSelectedFile().getAbsolutePath(); >// Смотрим какой фильтр выбран if(jf.getFileFilter()==pngFilter) < ImageIO.write(imag, «png», new File(fileName+».png»)); >else < ImageIO.write(imag, «jpeg», new File(fileName+».jpg»)); >> catch(IOException ex) < JOptionPane.showMessageDialog(f, «Ошибка ввода-вывода»); >> >; JMenuItem saveasMenu = new JMenuItem(saveasAction); fileMenu.add(saveasMenu); japan = new MyPanel(); japan.setBounds(30,30,260,260); japan.setBackground(Color.white); japan.setOpaque(true); f.add(japan); JToolBar toolbar = new JToolBar(«Toolbar», JToolBar.VERTICAL); JButton penbutton = new JButton(new ImageIcon(«pen.png»)); penbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=0; >>); toolbar.add(penbutton); JButton brushbutton = new JButton(new ImageIcon(«brush.png»)); brushbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=1; >>); toolbar.add(brushbutton); JButton lasticbutton = new JButton(new ImageIcon(«lastic.png»)); lasticbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=2; >>); toolbar.add(lasticbutton); JButton textbutton = new JButton(new ImageIcon(«text.png»)); textbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=3; >>); toolbar.add(textbutton); JButton linebutton = new JButton(new ImageIcon(«line.png»)); linebutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=4; >>); toolbar.add(linebutton); JButton elipsbutton = new JButton(new ImageIcon(«elips.png»)); elipsbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=5; >>); toolbar.add(elipsbutton); JButton rectbutton = new JButton(new ImageIcon(«rect.png»)); rectbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < rezhim=6; >>); toolbar.add(rectbutton); toolbar.setBounds(0, 0, 30, 300); f.add(toolbar); // Тулбар для кнопок JToolBar colorbar = new JToolBar(«Colorbar», JToolBar.HORIZONTAL); colorbar.setBounds(30, 0, 260, 30); colorbutton = new JButton(); colorbutton.setBackground(maincolor); colorbutton.setBounds(15, 5, 20, 20); colorbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < ColorDialog coldi = new ColorDialog(f,»Выбор цвета»); coldi.setVisible(true); >>); colorbar.add(colorbutton); JButton redbutton = new JButton(); redbutton.setBackground(Color.red); redbutton.setBounds(40, 5, 15, 15); redbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.red; colorbutton.setBackground(maincolor); >>); colorbar.add(redbutton); JButton orangebutton = new JButton(); orangebutton.setBackground(Color.orange); orangebutton.setBounds(60, 5, 15, 15); orangebutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.orange; colorbutton.setBackground(maincolor); >>); colorbar.add(orangebutton); JButton yellowbutton = new JButton(); yellowbutton.setBackground(Color.yellow); yellowbutton.setBounds(80, 5, 15, 15); yellowbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.yellow; colorbutton.setBackground(maincolor); >>); colorbar.add(yellowbutton); JButton greenbutton = new JButton(); greenbutton.setBackground(Color.green); greenbutton.setBounds(100, 5, 15, 15); greenbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.green; colorbutton.setBackground(maincolor); >>); colorbar.add(greenbutton); JButton bluebutton = new JButton(); bluebutton.setBackground(Color.blue); bluebutton.setBounds(120, 5, 15, 15); bluebutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.blue; colorbutton.setBackground(maincolor); >>); colorbar.add(bluebutton); JButton cyanbutton = new JButton(); cyanbutton.setBackground(Color.cyan); cyanbutton.setBounds(140, 5, 15, 15); cyanbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.cyan; colorbutton.setBackground(maincolor); >>); colorbar.add(cyanbutton); JButton magentabutton = new JButton(); magentabutton.setBackground(Color.magenta); magentabutton.setBounds(160, 5, 15, 15); magentabutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.magenta; colorbutton.setBackground(maincolor); >>); colorbar.add(magentabutton); JButton whitebutton = new JButton(); whitebutton.setBackground(Color.white); whitebutton.setBounds(180, 5, 15, 15); whitebutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.white; colorbutton.setBackground(maincolor); >>); colorbar.add(whitebutton); JButton blackbutton = new JButton(); blackbutton.setBackground(Color.black); blackbutton.setBounds(200, 5, 15, 15); blackbutton.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent event) < maincolor = Color.black; colorbutton.setBackground(maincolor); >>); colorbar.add(blackbutton); colorbar.setLayout(null); f.add(colorbar); tcc = new JColorChooser(maincolor); tcc.getSelectionModel().addChangeListener(new ChangeListener() < public void stateChanged(ChangeEvent e) < maincolor = tcc.getColor(); colorbutton.setBackground(maincolor); >>); japan.addMouseMotionListener(new MouseMotionAdapter() < public void mouseDragged(MouseEvent e) < if (pressed==true) < Graphics g = imag.getGraphics(); Graphics2D g2 = (Graphics2D)g; // установка цвета g2.setColor(maincolor); switch (rezhim) < // карандаш case 0: g2.drawLine(xPad, yPad, e.getX(), e.getY()); break; // кисть case 1: g2.setStroke(new BasicStroke(3.0f)); g2.drawLine(xPad, yPad, e.getX(), e.getY()); break; // ластик case 2: g2.setStroke(new BasicStroke(3.0f)); g2.setColor(Color.WHITE); g2.drawLine(xPad, yPad, e.getX(), e.getY()); break; >xPad=e.getX(); yPad=e.getY(); > japan.repaint(); > >); japan.addMouseListener(new MouseAdapter() < public void mouseClicked(MouseEvent e) < Graphics g = imag.getGraphics(); Graphics2D g2 = (Graphics2D)g; // установка цвета g2.setColor(maincolor); switch (rezhim) < // карандаш case 0: g2.drawLine(xPad, yPad, xPad+1, yPad+1); break; // кисть case 1: g2.setStroke(new BasicStroke(3.0f)); g2.drawLine(xPad, yPad, xPad+1, yPad+1); break; // ластик case 2: g2.setStroke(new BasicStroke(3.0f)); g2.setColor(Color.WHITE); g2.drawLine(xPad, yPad, xPad+1, yPad+1); break; // текст case 3: // устанавливаем фокус для панели, // чтобы печатать на ней текст japan.requestFocus(); break; >xPad=e.getX(); yPad=e.getY(); pressed=true; japan.repaint(); > public void mousePressed(MouseEvent e) < xPad=e.getX(); yPad=e.getY(); xf=e.getX(); yf=e.getY(); pressed=true; >public void mouseReleased(MouseEvent e) < Graphics g = imag.getGraphics(); Graphics2D g2 = (Graphics2D)g; // установка цвета g2.setColor(maincolor); // Общие рассчеты для овала и прямоугольника int x1=xf, x2=xPad, y1=yf, y2=yPad; if(xf>xPad) < x2=xf; x1=xPad; >if(yf>yPad) < y2=yf; y1=yPad; >switch(rezhim) < // линия case 4: g.drawLine(xf, yf, e.getX(), e.getY()); break; // круг case 5: g.drawOval(x1, y1, (x2-x1), (y2-y1)); break; // прямоугольник case 6: g.drawRect(x1, y1, (x2-x1), (y2-y1)); break; >xf=0; yf=0; pressed=false; japan.repaint(); > >); japan.addKeyListener(new KeyAdapter() < public void keyReleased(KeyEvent e) < // устанавливаем фокус для панели, // чтобы печатать на ней текст japan.requestFocus(); >public void keyTyped(KeyEvent e) < if(rezhim==3)< Graphics g = imag.getGraphics(); Graphics2D g2 = (Graphics2D)g; // установка цвета g2.setColor(maincolor); g2.setStroke(new BasicStroke(2.0f)); String str = new String(«»); str+=e.getKeyChar(); g2.setFont(new Font(«Arial», 0, 15)); g2.drawString(str, xPad, yPad); xPad+=10; // устанавливаем фокус для панели, // чтобы печатать на ней текст japan.requestFocus(); japan.repaint(); >> >); f.addComponentListener(new ComponentAdapter() < public void componentResized(java.awt.event.ComponentEvent evt) < // если делаем загрузку, то изменение размеров формы // отрабатываем в коде загрузки if(loading==false) < japan.setSize(f.getWidth()-40, f.getHeight()-80); BufferedImage tempImage = new BufferedImage(japan.getWidth(), japan.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D d2 = (Graphics2D) tempImage.createGraphics(); d2.setColor(Color.white); d2.fillRect(0, 0, japan.getWidth(), japan.getHeight()); tempImage.setData(imag.getRaster()); imag=tempImage; japan.repaint(); >loading=false; > >); f.setLayout(null); f.setVisible(true); > public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < new ImageEdit(); >>); > class ColorDialog extends JDialog < public ColorDialog(JFrame owner, String title) < super(owner, title, true); add(tcc); setSize(200, 200); >> class MyFrame extends JFrame < public void paint(Graphics g) < super.paint(g); >public MyFrame(String title) < super(title); >> class MyPanel extends JPanel < public MyPanel() < >public void paintComponent (Graphics g) < if(imag==null) < imag = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D d2 = (Graphics2D) imag.createGraphics(); d2.setColor(Color.white); d2.fillRect(0, 0, this.getWidth(), this.getHeight()); >super.paintComponent(g); g.drawImage(imag, 0, 0,this); > > // Фильтр картинок class TextFileFilter extends FileFilter < private String ext; public TextFileFilter(String ext) < this.ext=ext; >public boolean accept(java.io.File file) < if (file.isDirectory()) return true; return (file.getName().endsWith(ext)); >public String getDescription() < return «*»+ext; >> >

        Читайте также:
        Mach3 описание программы на русском

        Источник: metanit.com

        Простой графический редактор с использованием OpenCV

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

        image

        Рейтинг
        ( Пока оценок нет )
        Загрузка ...
        EFT-Soft.ru