-
-
-
Witam,
mam pytanko odnośnie zadania z grafiki komputerowej:
mam wczytać do panelu obrazek, w tym samym panelu dorysować kilka linii, modyfikując obrazek i potem go zapisać.
wczytuję obraz:
Kod: |
BufferedImage obraz = ImageIO.read(new File(sciezka));
g.drawImage(obraz,0,0,this);
|
lub maluję w panelu obraz
Kod: |
Image obrazek = new ImageIcon(sciezka).getImage();
g.drawImage(obrazek,0,0,this);
|
dodaję linie:
Kod: |
g.drawLine(x1,y1,x2,y2);
|
problem w tym że nie wiem jak zrobić to aby zapisany obrazek był razem z naniesionymi liniami. Czy w ogóle g.drawLine(...) modyfikuje obraz? Poproszę o wskazówkę. Dziękuję.
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dzanesko napisał/a: | Witam,
mam pytanko odnośnie zadania z grafiki komputerowej:
mam wczytać do panelu obrazek, w tym samym panelu dorysować kilka linii, modyfikując obrazek i potem go zapisać.
|
Z pamięci, więc nie traktuj tego dosłownie.
Wczytaj obrazek do BufferedImage:
BufferedImage img = ImageIO.readImage(...);
pobierz dla niego Graphics2D
Graphics2D g2d = (Graphics2D)img.createGraphics();
narysuj co trzeba
g2d.drawXXX(...);
Tak pobrany obrazek możesz potem zapisać na dysku (ImageIO.writeImage() o ile dobrze pamiętam) i/lub narysować na panelu w paintComponent();
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dzięki już działa.
A co dokładnie robi metoda createGraphics()?
bo mam teraz problem z graf. wektorową - chcę w panelu narysować jakieś dwie linie wtedy gdy ktoś kliknie, dlatego w metodzie mouseClicked() mam g2D.drawLine(...) ale nie wiem jak to przekazać do paintComponent(), który znajduje się w tej samej klasie, która dziedziczy z JPanel i implementuje MouseListener...
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dzanesko napisał/a: | dzięki już działa.
A co dokładnie robi metoda createGraphics()?
bo mam teraz problem z graf. wektorową - chcę w panelu narysować jakieś dwie linie wtedy gdy ktoś kliknie, dlatego w metodzie mouseClicked() mam g2D.drawLine(...) ale nie wiem jak to przekazać do paintComponent(), który znajduje się w tej samej klasie, która dziedziczy z JPanel i implementuje MouseListener... |
Tworzy Ci obiekt Graphics2D powiązany z BufferedImage a nie z panelem. Jeśli chcesz coś rysować po evencie to zrób coś w tym stylu:
Trzymaj img jako składową klasy i w listenerze dodaj wywołanie repaint();
d41d8cd98f00b204e9800998ecf8427e
-
-
-
taki bardzo prosty, niedługi kod, chodzi mi o to czy w mouseClicked() w PaneluWektorowym mogę zrobić tak jak w PaneluRastrowym, czyli kliknięcie na PaneluWektorowym powoduje wyrysowanie tego krzyżyka bo klik = true to nie za ambitny pomysł chyba...
Kod: |
package zad0;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.*;
public class Test3 {
PanelRastrowy pr;
PanelWektorowy pw;
JPanel pm;
JTextField text;
File fileOut;
BufferedImage img = null;
Graphics2D gLine;
Graphics2D g2D;
Graphics2D gW;
boolean klik = false;
int licznik = 0;
JButton koloWektor;
File fileIn;
public static void main(String args[]) {
Test3 test3 = new Test3();
test3.start();
}
public void start() {
JFrame ramka = new JFrame();
ramka.setLocation(100,100);
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setLayout(null);
// ramka.setSize(422,449);//xp
ramka.setSize(431,460);//w7
ramka.setVisible(true);
ramka.setTitle("Ćw. 1");
pr = new PanelRastrowy();
pr.setLocation(5,5);
pr.setSize(200,200);
pr.setBackground(Color.gray);
pw = new PanelWektorowy();
pw.setLocation(210,5);
pw.setSize(200,200);
pw.setBackground(Color.gray);
pm = new JPanel();
pm.setLocation(5,210);
pm.setSize(405,120);
pm.setLayout(new GridLayout(4,2,5,5));
ramka.add(pr);
ramka.add(pw);
ramka.add(pm);
JButton wczytajRastr = new JButton("Wczytaj");
JButton zapiszRastr = new JButton("Zapisz");
JButton usunRastr = new JButton("Usuń");
JButton rysujWektor = new JButton("Rysuj");
koloWektor = new JButton("Koło");
JButton usunWektor = new JButton("Usuń");
text = new JTextField();
JLabel sciezka = new JLabel("ścieżka pliku rastrowego",JLabel.LEFT);
JLabel naglowek = new JLabel("Podpis",JLabel.CENTER);
JLabel stopka = new JLabel("nr zadania",JLabel.CENTER);
ramka.add(naglowek);
ramka.add(stopka);
naglowek.setLocation(5,340);
naglowek.setSize(200,20);
stopka.setLocation(5,360);
stopka.setSize(295,20);
pm.add(wczytajRastr);
pm.add(rysujWektor);
pm.add(zapiszRastr);
pm.add(koloWektor);
pm.add(usunRastr);
pm.add(usunWektor);
pm.add(text);
pm.add(sciezka);
wczytajRastr.addActionListener(new KlikWczytajRastr());
zapiszRastr.addActionListener(new KlikZapiszRastr());
usunRastr.addActionListener(new KlikUsunRastr());
rysujWektor.addActionListener(new KlikRysujWektor());
koloWektor.addActionListener(new KlikKoloWektor());
usunWektor.addActionListener(new KlikUsunWektor());
}
public class PanelRastrowy extends JPanel implements MouseListener {
public PanelRastrowy() {
this.addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
gLine.setColor(Color.black);
gLine.drawLine(0,e.getY(),pr.getWidth(),e.getY());
gLine.drawLine(e.getX(),0,e.getX(),pr.getHeight());
this.repaint();
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g2D = (Graphics2D)g;
g2D.drawImage(img,null,0,0);
}
}
public class PanelWektorowy extends JPanel implements MouseListener {
public PanelWektorowy() {
this.addMouseListener(this);
}
public void mouseClicked(MouseEvent arg0) {
// gW.drawLine(0,(pr.getHeight()/2),pr.getWidth(),(pr.getHeight()/2));
// gW.drawLine((pr.getWidth()/2),0,(pr.getWidth()/2),pr.getHeight());
klik = true;
this.repaint();
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(klik == true) {
gW = (Graphics2D)g;
gW.setStroke(new BasicStroke(5));
gW.drawLine(0,(pr.getHeight()/2),pr.getWidth(),(pr.getHeight()/2));
gW.drawLine((pr.getWidth()/2),0,(pr.getWidth()/2),pr.getHeight());
}
if(licznik%2 != 0) {
g.setXORMode(Color.white);
g.fillOval((pw.getWidth()/4),(pw.getHeight()/4),100,100);
}
}
}
public class KlikWczytajRastr implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
try {
fileIn = new File(text.getText());
img = ImageIO.read(fileIn);
text.setText("Wczytano obraz");
}
catch(IOException e) {
text.setText("Błąd odczytu.");
}
if(fileIn.exists())
gLine = img.createGraphics();
else
text.setText("Taki plik nie istnieje.");
pr.repaint();
}
}
public class KlikZapiszRastr implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
fileOut = new File(text.getText());
try {
ImageIO.write(img,"jpg",fileOut);
text.setText("Obraz zapisany.");
}
catch(IOException e) {
text.setText("Błąd zapisu.");
}
}
}
public class KlikUsunRastr implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
img = null;
text.setText("");
pr.repaint();
}
}
public class KlikRysujWektor implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
klik = true;
pw.repaint();
}
}
public class KlikKoloWektor implements ActionListener {
public void actionPerformed(ActionEvent e) {
licznik++;
pw.repaint();
}
}
public class KlikUsunWektor implements ActionListener {
public void actionPerformed(ActionEvent e) {
klik = false;
licznik = 0;
pw.repaint();
}
}
}
|
[ Dodano: 2011-03-23, 09:40 ]
generalnie chodzi tylko o to jak zrobić aby w mouseClicked() były jakieś polecenia typu g2D.drawLine(...) a potem to przekazać do paintComponent() aby to narysował po kliknięciu...
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dzanesko napisał/a: | taki bardzo prosty, niedługi kod,
|
prosty niedługi kod to ma max 5 linijek
dzanesko napisał/a: |
[ Dodano: 2011-03-23, 09:40 ]
generalnie chodzi tylko o to jak zrobić aby w mouseClicked() były jakieś polecenia typu g2D.drawLine(...) a potem to przekazać do paintComponent() aby to narysował po kliknięciu... |
Panel ma być "wektorowy", więc malowanie po jakimś buforze raczej odpada...
Chcesz się popisać? No to spróbuj coś w tym stylu (standardowy disclaimer - nie sprawdzałem czy zadziała )
private List<Shape> objects = new ArrayList<Shape>();
W mouseClicked:
objects.add(new Line2D.Float(....));
repaint();
W paintcomponent coś w stylu
for (Shape s: objects)
{
g2d.draw(s);
}
PS
Źle startujesz aplikację - tworzysz komponenty Swingowe w złym wątku - poczytaj o SwingUtilities.invokeLater()
d41d8cd98f00b204e9800998ecf8427e
-
-
-
no to jednak muszę poczytać o wątkach
usprawniłem trochę program, wygląda nie co inaczej
jeżeli chodzi o widoczność po uruchomieniu to pomogło przeniesienie instrukcji ramka.setVisible(true); na koniec metody start()
dzięki za pomoc, pozdr.
[ Dodano: 2011-04-05, 23:47 ]
ćw. 2
proszę o wyjaśnienie w jaki sposób możemy pobrać grafikę do tabeli dwuwymiarowej (tabela pikseli) - najlepiej poprzez jakiś BufferedImage image?
d41d8cd98f00b204e9800998ecf8427e
Powered by phpBB modified by Przemo © 2003 phpBB Group. Then, after many years modified again, this time by Piotrek © 2014 Strona wygenerowana w 31,3ms. Zapytań do SQL: 16
|