Skalowanie obrazka

0

Witam,
Robię program do edycji obrazków. Natrafiłem na problem przy skalowaniu. Rozmiar obrazka jest poprawny przy zmianach ale sam obrazek jest źle wyświetlany na panelu i nie wiem jak to naprawić... Wszelkie propozycje mile widziane :)

moj panel imgPanel:

public class ImgPanel extends JPanel {
	private BufferedImage image;
	
	public ImgPanel (BufferedImage image) {
		this.image = image;
		
		MediaTracker mt = new MediaTracker(this);
	     	mt.addImage(image, 0);
	     	try {
	       		mt.waitForID(0);
	     	}
	     	catch (Exception e) {
	       		e.printStackTrace();
	     	}
	}

	public void scale(int percent) {
		int w = image.getWidth();
		int h = image.getHeight();
		int newW = w+(w*percent/100);
		int newH = h+(h*percent/100);

		AffineTransform scale = AffineTransform.getScaleInstance(w /2, h /2);
		BufferedImageOp op = new AffineTransformOp(scale, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
		BufferedImage filteredImage = new BufferedImage(newW, newH, image.getType());
        	op.filter(image, filteredImage);
        	image = filteredImage;
        	repaint();
	}
	
	public void paintComponent(Graphics g) {
        	super.paintComponent(g);
        	Graphics2D g2d = (Graphics2D)g;
        	int x = (getWidth() - image.getWidth(this))/2;
        	int y = (getHeight() - image.getHeight(this))/2;
        	g2d.drawImage(image, x, y, null);
        	revalidate();
	}
}
0

Nie lepiej było by użyć metody repaint() zamiast revalidate()?? (w metodzie paintComponent)

0

No nie bardzo, bo wtedy scrollpane, na którym jest ten panel nie zmienia rozmiarów przy nowych rozmiarach obrazka. I w czym miało by to pomóc? Serio pytam bo nie wiem.

0

Może zmieniaj rozmiary panelu.

0

Źle się chyba wysłowiłem w drugim poście, scrollpane nie zmienia swoich rozmiarów raczej (najwyżej z całym oknem), za to panel zmienia swój rozmiar (zwiększa, zmniejsza w zależności co tam wybiorę). Panel jest osadzony w scrollpane

                jScrollPane1 = new JScrollPane();
		title = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), file.getName());
		jScrollPane1.setBorder(title);
		getContentPane().add(jScrollPane1, BorderLayout.CENTER);
		{
			imgPanel = new ImgPanel(img);
			GridLayout imgPanelLayout = new GridLayout(1, 1);
			imgPanelLayout.setColumns(1);
			imgPanelLayout.setHgap(5);
			imgPanelLayout.setVgap(5);
			jScrollPane1.setViewportView(imgPanel);
			imgPanel.setLayout(imgPanelLayout);
		}

Problem jest raczej z samym wyświetlaniem obrazka (bo nawet zapisuje do pliku to co jest na panelu o zmienionej wielkości).
Zauważyłem, że przy zmianie dzielników w kodzie:

AffineTransform scale = AffineTransform.getScaleInstance(w /2, h /2);

z 2 na jakiś większy, np. 100 wyświetla się "więcej" obrazka. Gdy podaje ujemny procent to wielkość obrazka się zmniejsza natomiast sam obrazek się i tak "przybliża".
Mam nadzieję, że w miarę jasno wyjaśniłem.

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