Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 26.05.2018
Сообщений: 100
1

Копирование фрагмента изображения с одного места на другое

23.04.2022, 18:48. Показов 591. Ответов 2

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня задание нужно копировать фрагмент изображения с одного места на другое. Я понимаю что нужно через события построить rectangle дальше записать его в BufferedImage, и потом перерисовывать его в нужном месте. Я застопорился на месте записи прямоугольника в изображение. Подскажите как это реализовать.
Вот код моей программы:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package com.itproger;
 
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
 
public class Lab5_task1 extends JFrame {
 
    Rectangle rect;
    int x,y,x1,y1;
    Image  im1;
    Image im;
 
    public Lab5_task1()
    {
        setTitle("Лабораторная работа №5. Задание №1");
        setBounds(400, 100,970,900);
        MyPanel panel = new MyPanel();
        Container pane = getContentPane();
        panel.addMouseListener(new Lab5_task1.Actions());
        pane.add(panel);
    }
 
    class MyPanel extends JPanel{
 
        public MyPanel()
        {
            try {
                im = ImageIO.read(new File("D:/Study/9IVT-02/GoldCoast.jpg"));
            }
            catch(IOException exc)
            { }
        }
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(im,10,10,null);
            //g.drawImage(im1,30,700,null);
            g.drawImage(im1,10,700, this);
        }
    }
 
    public class Actions implements MouseListener {
        @Override
        public void mouseClicked(MouseEvent evc) {
            x=evc.getX();
            y=evc.getY();
        }
 
        @Override
        public void mousePressed(MouseEvent e) {
 
        }
 
        @Override
        public void mouseReleased(MouseEvent e) {
            x1=e.getX();
            y1=e.getY();
            int x3 = Math.min(x, x1);
            int x4 = Math.max(x, x1);
            int y3 = Math.min(y, y1);
            int y4 = Math.max(y, y1);
            rect = new Rectangle(x1, y1, x4 - x3, y4 - y3);
            Canvas c = new Canvas();
            im1 = c.createImage(rect.width, rect.height);
        }
 
        @Override
        public void mouseEntered(MouseEvent e) {
 
        }
 
        @Override
        public void mouseExited(MouseEvent e) {
 
        }
    }
}
Помогите пожалуйста оч надо
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2022, 18:48
Ответы с готовыми решениями:

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

Копирование из одного места в другое с ипользованием mutex
Копирование из одного места в другое с ипользованием мьютекса.Приложение должно работать как в...

Копирование файлов и папок (и .т.ч. скрытых) из одного места в другое
Добрый день :) Начал разбираться с VS C++/CLI в конкретности с System::IO и не смог разобраться...

Копирование области чертежа из одного места в другое в Autocad
Нужно собрать чертеж из отдельных элементов (типовое изделие по размерам) части для сборки...

2
28 / 18 / 10
Регистрация: 09.05.2019
Сообщений: 69
07.06.2022, 14:45 2
Короче я почти сделал , оно даже как-то работает, но с ошибками и с артефактами, я не знаю изза чего...

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Main {
 
    public static void main(String[] args) {
        
 
        BufferedImage image1 = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB) {{
            Graphics g = getGraphics();
            g.setColor(Color.red);
            g.fillRect(300, 0, 100,400);
            g.setColor(Color.white);
            g.fillOval(50, 50, 260, 100);
            g.setColor(Color.darkGray);
            g.fillRect(22, 22, 113, 113);
        }};
        
        new JFrame() {
            {
                add(new JPanel() {
                    boolean 
                        selectMode = false,
                        pasteMode = false;
                    int[] selectCord;
                    int[] pasteCord;
                    
                    BufferedImage pasteImage;
                    public void paint(Graphics g) {
                        super.paintComponent(g);
                        g.drawImage((Image)image1, 0, 0, this);
                        g.setColor(Color.blue);
                        if (selectMode)
                            g.fillRect(selectCord[0], selectCord[1], selectCord[2], selectCord[3]);
                        else if(pasteMode)
                            g.drawImage(pasteImage, pasteCord[0], pasteCord[1], null);
                    }
                    {
                        addMouseListener(new MouseListener() {
                            public void mouseClicked(MouseEvent e) {
                                if (pasteMode) {
                                    image1.getGraphics().drawImage((Image)pasteImage,
                                            pasteCord[0], pasteCord[1], rootPane);
                                    pasteMode=false;
                                }
                                    
                            }
                            public void mouseExited(MouseEvent e) {}
                            public void mouseEntered(MouseEvent e) {}
                            public void mouseReleased(MouseEvent e) {
                                if(selectMode) {
                                    selectMode=false;
                                    pasteImage = image1.getSubimage(selectCord[0],
                                            selectCord[1], selectCord[2], selectCord[3]);
                                    pasteMode=true;
                                    repaint();
                                }
                                
                            }
                            public void mousePressed(MouseEvent e) {
                                if (!pasteMode) {
                                    selectMode= true;
                                    selectCord = new int[] {
                                        e.getX(),e.getY(),e.getPoint().x,e.getPoint().y
                                    };
                                }
                                    
                            }
                        });
                        addMouseMotionListener(new MouseMotionListener() {
                            public void mouseMoved(MouseEvent e) {
                                if (pasteMode) {
                                    pasteCord= new int[] {e.getX(),e.getY()};
                                    repaint();
                                }
                                    
                            }
                            public void mouseDragged(MouseEvent e) {
                                if(selectMode)
                                    selectCord = new int[] {
                                        selectCord[0],selectCord[1],
                                        e.getX()-selectCord[0],e.getY()-selectCord[1]
                                    };
                                repaint();
                            }
                        });
                        
                    }
                });
                setVisible(true);setDefaultCloseOperation(3);setSize(600,600);
            }
        };
    }
}



источники:

https://spec-zone.ru/RU/Java/T... image.html
Миниатюры
Копирование фрагмента изображения с одного места на другое  
0
28 / 18 / 10
Регистрация: 09.05.2019
Сообщений: 69
07.06.2022, 16:51 3
Лучший ответ Сообщение было отмечено PurpleLoris как решение

Решение

Исправил косяки...


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Main {
    public static void main(String[] args) {
        BufferedImage image1 = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB) {{
            Graphics g = getGraphics();
            g.setColor(Color.red);
            g.fillRect(300, 0, 100,400);
            g.setColor(Color.white);
            g.fillOval(50, 50, 260, 100);
            g.setColor(Color.darkGray);
            g.fillRect(22, 22, 113, 113);
        }};
        new JFrame() {
            {
                add(new JPanel() {
                    boolean 
                        selectMode = false,
                        pasteMode = false;
                    int[] selectCord;
                    int[] pasteCord ;
                    BufferedImage pasteImage;
                    public void paint(Graphics g) {
                        super.paintComponent(g);
                        g.drawImage(image1, 0, 0, this);
                        g.setColor(Color.blue);
                        if (selectMode)
                            g.fillRect(selectCord[0], selectCord[1], selectCord[2], selectCord[3]);
                        else if(pasteMode)
                            g.drawImage(pasteImage, pasteCord[0], pasteCord[1], null);
                    }
                    {
                        addMouseListener(new MouseListener() {
                            public void mouseClicked(MouseEvent e) {
                                if (pasteMode) {
                                    image1.getGraphics().drawImage(
                                        new BufferedImage(pasteImage.getWidth(), pasteImage.getHeight(), pasteImage.getType()) {{
                                            getGraphics().drawImage(pasteImage, 0, 0, null);
                                        }},
                                        pasteCord[0], pasteCord[1], null
                                    );
                                    pasteMode=false;
                                }
                            }
                            public void mouseExited(MouseEvent e) {}
                            public void mouseEntered(MouseEvent e) {}
                            public void mouseReleased(MouseEvent e) {
                                if(selectMode) {
                                    selectMode=false;
                                    pasteImage = new BufferedImage(Math.abs(selectCord[2]),Math.abs(selectCord[3]), BufferedImage.TYPE_INT_RGB) {{
                                        getGraphics().drawImage(image1.getSubimage(
                                            selectCord[2]>0?selectCord[0]:selectCord[0]+selectCord[2],
                                            selectCord[3]>0?selectCord[1]:selectCord[1]+selectCord[3], 
                                            Math.abs(selectCord[2]), 
                                            Math.abs(selectCord[3])
                                        ), 0, 0, null);
                                    }};
                                    pasteMode=true;
                                    pasteCord = new int[] {e.getX(),e.getY()};
                                    repaint();
                                }
                                
                            }
                            public void mousePressed(MouseEvent e) {
                                if (!pasteMode) {
                                    selectMode= true;
                                    selectCord = new int[] {
                                        e.getX(),e.getY(),e.getPoint().x,e.getPoint().y
                                    };
                                }
                                    
                            }
                        });
                        addMouseMotionListener(new MouseMotionListener() {
                            public void mouseMoved(MouseEvent e) {
                                if (pasteMode) {
                                    pasteCord= new int[] {e.getX(),e.getY()};
                                    repaint();
                                }
                            }
                            public void mouseDragged(MouseEvent e) {
                                if(selectMode)
                                    selectCord = new int[] {
                                        selectCord[0],selectCord[1],
                                        e.getX()-selectCord[0],e.getY()-selectCord[1]
                                    };
                                repaint();
                            }
                        });
                    }
                });
                setVisible(true);setDefaultCloseOperation(3);setSize(600,600);
            }
        };
    }
}



Проблема была в том что при использовании команды getSubimage(int x, int y, int w, int h) ,Возвращенный BufferedImage использует тот же массив данных, что и исходное изображение., поэтому нужно делать костыли...

источники:

https://stackoverflow.com/ques... feredimage



https://stackoverflow.com/ques... ufferimage
1
07.06.2022, 16:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2022, 16:51
Помогаю со студенческими работами здесь

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

Задан текстовый файл. Выполнить копирование этого файла из одного места в другое.
задание: 1. Создать или открыть текстовый (типизированный, нетипизированный) файл. 2. Выполнить...

Задан текстовый файл. Выполнить копирование этого файла из одного места в другое
Задан текстовый файл. Выполнить копирование этого файла из одного места в другое.

Задан текстовый файл. Выполнить копирование этого файла из одного места в другое
задание: 1. Создать или открыть текстовый (типизированный, нетипизированный) файл. 2. Выполнить...

Задан текстовый файл. Выполнить копирование этого файла из одного места в другое
1. Создать или открыть текстовый (типизированный, нетипизированный) файл. 2. Выполнить над...

Переместить папку из одного места в другое
Как перемести папку из одной папки в другую ? Нашел это: /* Перемешение директории public...

Перетащить объект из одного места в другое
Здравствуйте! У меня такая задача: нужно картинку перетащить в ячейку таблицы. Я почитал про...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru