Moin zusammen.
Ich habe zwei Probleme mit einer sehr großen Grafik. Eine vergleichbare habe ich angehängt. Müsst ihr wieder vergrößern auf 6000x3000 Pixel. Das Original, was später eingesetzt werden soll, ist 230KB groß.
Über Pfeil Auf/Ab soll es möglich sein das Bild zu skalieren. Das habe ich auch soweit hinbekommen mit drawImage. Ich verwende VALUE_INTERPOLATION_NEAREST_NEIGHBOR, da dass die schnellste Methode sein soll. Nun zu meinen Problemen.
1. Das ganze ist ein Speicherfresser. Ohne mindestens mit -Xmx256M zu starten wird nicht mal das Bild geladen bzw. das Skalieren geht nicht. Manchmal funktioniert das Skalieren damit nicht einmal. Das Skalieren läuft nicht gerade flüssig. Ich hatte gehofft, wenn man fünf Mal verkleinert (fünf Mal sofort Pfeil Ab drücken) wird das relativ schnell ausgeführt. Es dauert aber etwa 5 Sekunden und auch nur wenn ich schon auf 512MB erhöhe. Wie kann ich das besser machen?
2. Wie kann ich den JFrame mit anpassen? Je kleiner das Bild wird, umso größer werden die grauen Bereiche, weil sich der Frame nicht mit anpasst. Mit setSize geht das zwar, aber ich möchte nicht, dass er größer wird als 1000x800. Das gleiche gilt für das verwendete JPanel und die JScrollPane.
Vielen Dank schon mal für eure Vorschläge.
Ich habe zwei Probleme mit einer sehr großen Grafik. Eine vergleichbare habe ich angehängt. Müsst ihr wieder vergrößern auf 6000x3000 Pixel. Das Original, was später eingesetzt werden soll, ist 230KB groß.
Über Pfeil Auf/Ab soll es möglich sein das Bild zu skalieren. Das habe ich auch soweit hinbekommen mit drawImage. Ich verwende VALUE_INTERPOLATION_NEAREST_NEIGHBOR, da dass die schnellste Methode sein soll. Nun zu meinen Problemen.
1. Das ganze ist ein Speicherfresser. Ohne mindestens mit -Xmx256M zu starten wird nicht mal das Bild geladen bzw. das Skalieren geht nicht. Manchmal funktioniert das Skalieren damit nicht einmal. Das Skalieren läuft nicht gerade flüssig. Ich hatte gehofft, wenn man fünf Mal verkleinert (fünf Mal sofort Pfeil Ab drücken) wird das relativ schnell ausgeführt. Es dauert aber etwa 5 Sekunden und auch nur wenn ich schon auf 512MB erhöhe. Wie kann ich das besser machen?
2. Wie kann ich den JFrame mit anpassen? Je kleiner das Bild wird, umso größer werden die grauen Bereiche, weil sich der Frame nicht mit anpasst. Mit setSize geht das zwar, aber ich möchte nicht, dass er größer wird als 1000x800. Das gleiche gilt für das verwendete JPanel und die JScrollPane.
Vielen Dank schon mal für eure Vorschläge.
Java:
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class Visualisierung3 extends JFrame{
private static final long serialVersionUID = 1L;
private JScrollPane jScrollPane = null;
private JPanel jPanel = null;
private JLabel hintergrundLabel;
private BufferedImage hintergrundBildNormal;
private BufferedImage hintergrundBildScaled;
private int widthHintergrund = 6000;
private int heightHintergrund = 3000;
private int zoom = 10;
private final int MAXZOOM = 10;
private final int MINZOOM = 1;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Visualisierung3 thisClass = new Visualisierung3();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
public Visualisierung3() {
super();
try {
hintergrundBildNormal = ImageIO.read(new File("C:\\Bild.gif"));
hintergrundBildScaled = hintergrundBildNormal;
} catch (IOException e) {
e.printStackTrace();
}
this.setSize(1000, 800);
this.setMaximumSize(new Dimension(1000, 800));
this.setTitle("Visualisierung");
this.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
if (zoom != MINZOOM)
{
zoom = zoom - 1;
}
labelSkalieren();
}
if(e.getKeyCode()==KeyEvent.VK_UP)
{
if (zoom != MAXZOOM)
{
zoom = zoom + 1;
}
labelSkalieren();
}
}
});
jPanel = new JPanel();
jPanel.setLayout(null);
hintergrundLabel = new JLabel(new ImageIcon(hintergrundBildScaled));
hintergrundLabel.setSize(widthHintergrund, heightHintergrund);
jPanel.setPreferredSize(hintergrundLabel.getSize());
jPanel.add(hintergrundLabel);
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(jPanel);
this.setContentPane(jScrollPane);
this.setVisible(true);
}
private void labelSkalieren() {
hintergrundBildScaled = scale(hintergrundBildNormal, (float) zoom/MAXZOOM);
hintergrundLabel.setSize(hintergrundBildScaled.getWidth(), hintergrundBildScaled.getHeight());
hintergrundLabel.setIcon(new ImageIcon(hintergrundBildScaled));
// this.setBounds(0, 0, hintergrundLabel.getWidth(), hintergrundLabel.getHeight());
// this.setSize(hintergrundLabel.getSize());
this.repaint();
}
public BufferedImage scale(BufferedImage source, float factor) {
int width = (int) (source.getWidth() * factor);
int height = (int) (source.getHeight() * factor);
BufferedImage img = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) img.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
g2d.drawImage(source, 0, 0, width, height, null);
return img;
}
}