Moduł powiększania zdjęcia moduł

Odpowiedz Nowy wątek
2019-05-17 23:55
0

Stworzyłem niewielki prosty moduł gdzie można wczytać zdjęcie powiększyć oraz będzie jeszcze opcja zapisu. Problem na obecnym etapie tworzenia jest
tylko w tym iż z wielkim trudem powiększa fotkę przesuwając kontrolkę JSlider. Nie wiem czy to jest kwestia obiektu zwanego ,,img" czy też obiektu ,,ico".

Gdyby komus nie chciało sie rozpakować rar załaczam kod :

package practise_use_slider;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JSlider;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class ResizeSelectedPhoto extends JFrame {

private JPanel contentPane;
BufferedImage img = null;
ImageIcon ico;
JLabel image;
int width, height, imageH2,imageW2;
public JSlider slider;

/**
 * Launch the application.
 */
public void openSource()
{
    JFileChooser choose = new JFileChooser();
    int result = choose.showOpenDialog(null);
    if(result == JFileChooser.APPROVE_OPTION){
        File f = choose.getSelectedFile();
        try{

            img = ImageIO.read(f);
            width = img.getWidth();
            height = img.getHeight();
            /*
            if(width >= 500){
                JFrame window2 = new JFrame();
                JPanel p2 = new JPanel();
                window2.getContentPane().add(p2);
                window2.setVisible(true);
                window2.setDefaultCloseOperation(window2.EXIT_ON_CLOSE);
                window2.setSize(300, 100);
                JLabel command = new JLabel("Zdjecie jest zbyt duze wybierz inne");
                p2.add(command);
            }else{*/

            int a = img.getWidth() - image.getWidth() / 2;
            imageW2 = img.getWidth() - a;

            int b = img.getHeight() - image.getHeight() / 2;
            imageH2 = img.getHeight() - b;
            ico = new ImageIcon(img.getScaledInstance(200,150,Image.SCALE_DEFAULT));

            image.setIcon(ico);

        }catch(IOException ea){
            ea.printStackTrace();
        }
    }
}

public void changeImageMeasure()
{
    slider.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {

            JSlider slider = (JSlider)e.getSource();
            ImageIcon ico2 = new ImageIcon(img.getScaledInstance(ico.getIconWidth()+slider.getValue(), ico.getIconHeight()+slider.getValue(), Image.SCALE_DEFAULT));
            System.out.println(ico.getIconWidth()+slider.getValue()+ "" + ico.getIconHeight()+slider.getValue());
            image.setIcon(ico2);
        }
    });

}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ResizeSelectedPhoto frame = new ResizeSelectedPhoto();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public ResizeSelectedPhoto() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 544, 382);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JPanel panel = new JPanel();
    contentPane.add(panel, BorderLayout.CENTER);
    panel.setLayout(null);

    image = new JLabel("",JLabel.CENTER);
    image.setOpaque(true);
    image.setBounds(10, 11, 480, 220);
    panel.add(image);

    JButton btnNewButton = new JButton("Open Browser");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            openSource();
        }
    });
    btnNewButton.setBounds(204, 242, 107, 23);
    panel.add(btnNewButton);

    slider = new JSlider();
    slider.setMaximum(50);
    slider.setMajorTickSpacing(10);
    slider.setMinorTickSpacing(5);
    slider.setPaintLabels(true);
    slider.setPaintTicks(true);
    slider.setValue(0);
    slider.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {

            slider.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent e) {

                    changeImageMeasure();
                }
            });
        }
    });
    slider.setBounds(45, 276, 394, 47);
    panel.add(slider);
}

}


:)

Pozostało 580 znaków

2019-05-19 20:29
0

Podejrzewam, że problemem jest wielokrotna zmiana rozmiaru. Slider generuje wiele zdarzeń podczas przesuwania i każde jest obsługiwanie poprzez wykonanie operacji na obrazie. A powinno być to zrobione tylko dla pozycji slidera po zatrzymaniu. Zdaje się, że jest tam taka metoda, która pozwala w listenerze sprawdzić, czy użytkownik zakończył przesuwanie.
Dodaj jakiś log do stateChanged albo do changeImageMeasure i zobacz ile razy się wypisuje, bo powinien tylko raz.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0