Zoomen eines Bildes!

Status
Nicht offen für weitere Antworten.

KOKser

Aktives Mitglied
Mahlzeit,

ich möchte gerne auf einer JSplitPane ein Bild zeichnen lassen, welches sich zoomen lässt!

Ich hab hier zu schon zwei Sachen gefunden!

1. http://www.java-forum.org/de/viewtopic.php?t=46910&highlight=zoom
2. http://www.java-forum.org/de/viewtopic.php?t=70922&highlight=zoom

Ich nutze Swing daher weis ich nicht ob ich die erste Variante nutzen kann da dort viel mit AWT Objekten gearbeitet wird oder doch lieber die zweite! Wobei ich bei der zweiten Variante nicht weis wie ich sie nutzen kann, also sie z.b. über ein JPanel mit einzubinden !!

lg KOKser
 
ich kann im ersten Link nichts zu AWT erkennen,
'JXTransformer: The power of a real Swing!' kannst du doch nicht zu AWT zuordnen?
hab mir aber den Quellcode nicht angeschaut
 
Hab es jetzt soweit mit integriert!

Beim ausführen des MousWheelListeners kommt es zum OUT-Off Memory Error, desweiteren kommt es zu keiner veränderung des Bildes und es dauert ewig!

Kleiner Auszug aus der Konsole:

Mouse wheel moved UP 1 notch(es)

Mouse wheel moved UP 2 notch(es)

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
...



Habt ihr eine Idee woran es liegen kann?

Code:
package local.nette.Lager.Gui.Content;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class Map extends JPanel implements MouseWheelListener{  
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private BufferedImage image;  
	int x, y;  
	     
	public Map(String source) {  
		super();  
		this.addMouseWheelListener(this);
	    this.image = this.loadImage(source);  
	    this.x = this.image.getWidth();  
	    this.y = this.image.getHeight();  
	}  
	     
	public void resize(int newW, int newH) {  
		int w = this.image.getWidth();  
		int h = this.image.getHeight();  
		BufferedImage dimg =  new BufferedImage(newW, newH, this.image.getType());  
	    Graphics2D g = dimg.createGraphics();  
	    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
	    g.drawImage(this.image, 0, 0, newW, newH, 0, 0, w, h, null);  
	    //g.dispose();
	    //this.paintComponents(g);
	}
	
	public BufferedImage loadImage(String ref) {  
		BufferedImage bimg = null;  
		try {  
				bimg = ImageIO.read(new File(ref));  
		} catch (Exception e) {  
				e.printStackTrace();  
		}  
		return bimg;  
	}  
	
	public BufferedImage getMap(){
		return this.image;
	}
	
	public void setMap(BufferedImage img){
		this.image = img;
	}
	
	@Override 
	protected void paintComponent(Graphics g) {  
	    super.paintComponent(g);  
	    g.drawImage(this.image, 0, 0, null);  
	}

	 final static String newline = "\n";
	
	public void mouseWheelMoved(MouseWheelEvent e) {
		// TODO Auto-generated method stub
		String message;
	    int notches = e.getWheelRotation();
	    if (notches < 0) {
	      this.resize(new Double(this.image.getWidth()*0.9).intValue(), new Double(this.image.getHeight()*0.9).intValue());
	      message = "Mouse wheel moved UP " + -notches + " notch(es)"
	          + newline;
	    } else {
	    	this.resize(new Double(this.image.getWidth()*1.1).intValue(), new Double(this.image.getHeight()*1.1).intValue());
	    	message = "Mouse wheel moved DOWN " + notches + " notch(es)"
	          + newline;
	    }
	    System.out.println(message);
	  }
}
 
enjoy....

sicher nicht perfekt aber in 3 min gecoded....(basierend auf deinem Code und zu 90% übernommen)

Code:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Map extends JPanel implements MouseWheelListener {
	/**
    *
    */
	private static final long serialVersionUID = 1L;
	private BufferedImage originalImage;
	int x, y;

	private BufferedImage resizedImage;

	public Map(String source) {
		super();
		this.addMouseWheelListener(this);
		this.originalImage = this.loadImage(source);
		this.x = this.originalImage.getWidth();
		this.y = this.originalImage.getHeight();
		this.resizedImage = this.originalImage;
	}

	public BufferedImage resizeImage(int newW, int newH) {

		BufferedImage dimg = new BufferedImage(newW, newH, originalImage.getType());
		Graphics2D g = dimg.createGraphics();
		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g.drawImage(originalImage, 0, 0, newW, newH, 0, 0, x, y, null);
		g.dispose();
		return dimg;

	}

	public static BufferedImage loadImage(String ref) {
		BufferedImage bimg = null;
		try {
			bimg = ImageIO.read(new File(ref));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bimg;
	}

	public BufferedImage getMap() {
		return this.originalImage;
	}

	public void setMap(BufferedImage img) {
		this.originalImage = img;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(this.resizedImage, 0, 0, null);
	}

	final static String newline = "\n";

	public void mouseWheelMoved(MouseWheelEvent e) {
		// TODO Auto-generated method stub
		String message;
		int notches = e.getWheelRotation();
		if (notches < 0) {
			resizedImage = resizeImage(new Double(resizedImage.getWidth() * 0.9).intValue(), new Double(resizedImage.getHeight() * 0.9)
					.intValue());
			message = "Mouse wheel moved UP " + -notches + " notch(es)" + newline;
		} else {
			resizedImage = resizeImage(new Double(resizedImage.getWidth() * 1.1).intValue(), new Double(resizedImage.getHeight() * 1.1)
					.intValue());
			message = "Mouse wheel moved DOWN " + notches + " notch(es)" + newline;
		}
		System.out.println(message);
		repaint();
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		Map map = new Map("test");
		frame.getContentPane().add(map);
		frame.setSize(500, 500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

EDIT:
ach jetzt seh ichs..bei grossen Bildern hauts ne exception...
man sollte verhindern, dass während dem resizen wieder geresized wird...
also....resizeImage nur ausgeführt wird, wenn nicht gerade geresized wird
 
Und wie organisier ich mir das? Per IF anweisung im MouseWheelListener?

Edit:

Hab mal diese If-Anweisung mit rein genommen! Out-off Memory kommt immer noch am Anfang einmal! Bei Bild passiert weiterhin nichts!

PS: hab deinen Quelltext verbesserungen übernommen

Code:
public void mouseWheelMoved(MouseWheelEvent e) {
		// TODO Auto-generated method stub
		String message;
	    int notches = e.getWheelRotation();
	    if (notches < 0) {
	      if(this.resizeState == false){
	    	  this.resizeState = true;
	    	  this.resizedImage=resizeImage(this.originalImage, new Double(this.originalImage.getWidth()*0.5).intValue(), new Double(this.originalImage.getHeight()*0.5).intValue());
	    	  this.resizeState = false;
	      }
	      message = "Mouse wheel moved UP " + -notches + " notch(es)"
	          + newline;
	    } else {
	    	if(this.resizeState == false){
	    		this.resizeState = true;
	    		this.resizedImage=resizeImage(this.originalImage, new Double(this.originalImage.getWidth()*2).intValue(), new Double(this.originalImage.getHeight()*2).intValue());
	    		this.resizeState =false;
	    	}
	    	message = "Mouse wheel moved DOWN " + notches + " notch(es)"
	          + newline;
	    }
	    System.out.println(message);
	  }
 
Da gibts noch ganz andere Probleme.
Wenn du ein grosses Bild zoomen willst, dann wird es so gross, dass der Heap nicht mehr passt.
Die Lösung dazu ist, nur den Teil der nachher sichtbar sein soll zu zoomen. Damit
spart man sich einen grossen Teil des zommens. eine fertige lösung
hab ich grad nicht parat, vielleicht jemand anderes (oder google)
 
Okey danke erst mal!

Hätte jemand eine idee wie ich die 2 Variante als Panel implementieren könnte!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben