• dzanesko  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • dzanesko  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • dzanesko  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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
  • dzanesko  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • wcale nie chcę się popisywać :) tylko myślałem że moje rozwiązanie jest "prostackie", dzięki za podpowiedź

    scho napisał/a:
    PS
    Źle startujesz aplikację - tworzysz komponenty Swingowe w złym wątku - poczytaj o SwingUtilities.invokeLater()

    a odnośnie złego startu (chyba to jest przyczyną, że po uruchomieniu muszę ramkę zminimalizować lub zmienić rozmiar okna aby panele były widoczne), czy mogę prosić o wskazówkę bo sobota tuż tuż a program oddać muszę, a to mój pierwszy GUI, a wszystko co przeglądałem to po ENG a u mnie średnio z tym językiem :/ ale się uczę :) , powoli, wolę JAVĘ :)
    Dziękuję.
    d41d8cd98f00b204e9800998ecf8427e
  • VIPscho  
    Wydział: W-4 EKA

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • dzanesko napisał/a:

    a odnośnie złego startu (chyba to jest przyczyną, że po uruchomieniu muszę ramkę zminimalizować lub zmienić rozmiar okna aby panele były widoczne), czy mogę prosić o wskazówkę bo sobota tuż tuż a program oddać muszę, a to mój pierwszy GUI, a wszystko co przeglądałem to po ENG a u mnie średnio z tym językiem :/ ale się uczę :) , powoli, wolę JAVĘ :)
    Dziękuję.


    Nie sądzę. Przyczyną jest raczej brak LayoutManagera i/lub wywołania pack() dla JFrame przed jej pokazaniem.
    Co do uruchomienia - Swing nie jest threadsafe i wszystkie operacje modyfikujące jego komponenty trzeba wykonywać w odpowiednim wątku. Coś w tym stylu:
    class App {
    ... main(...)
    {
    SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run()
    {
    App app = new App();
    app.start();
    }
    });
    }


    PS
    Ucz się angielskiego... bardziej się przyda niż Java ;P
    d41d8cd98f00b204e9800998ecf8427e
  • dzanesko  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • 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