Bild effektiv vergrössern / verkleinern (zoom)

Status
Nicht offen für weitere Antworten.

el_vital

Aktives Mitglied
Ich zeige ein Bild auf einem jLabel als Icon an. Das Bild möchte ich zoomen. Wenn ich es durch unten stehende Methode mache, dann ist es ziemlich langsam. Gibt es einen Weg es mit einem Icon zu beschleunigen oder sollte man das Bild anders darstellen?
Danke im Voraus.


Code:
   iGlobHeight = iGlobHeight - 10;
   iGlobWidth = iGlobWidth - 10;
   jLabelBild.setIcon(new ImageIcon(ImgKlein.getScaledInstance(iGlobWidth, iGlobHeight, Image.SCALE_FAST)));
 

el_vital

Aktives Mitglied
alles klar. Danke. So werde ich es auch machen.

Noch eine Frage. Kann man das Aktualisieren der Oberfläche ausschalten, etwas tun und dann einschalten?
Ich habe ein Laben mit einem Bild. Über dem LAbel habe ich noch ein Label mit einem transparenten PNG Bild. Wenn ich an dem unteren Bild was ändere muss ich das obere Bild neu zeichnen. Wenn ich das mache, flackert das Bild. Es wäre besser die Aktualisierung der Oberfläche auszuschalten, unteres Bild ändern, oberes zeichen und die Oberfläche aktualisieren. Dann würde nichts flackern. Zu mindestens ist es bei C# so.
 

el_vital

Aktives Mitglied
bei einer Bewegung nach links mache ich jetzt z.B. folgendes:

Code:
    iGlobY = iGlobY+10; 
    
    // Kann man hier die grafische Aktualisierung ausschalten?    
    gLabelImage.clearRect(0, 0, 500, 500);
    gLabelImage.drawImage(buffImgOriginal, iGlobX, iGlobY,  iGlobWidth, iGlobHeight, null);
    gLabelMaske.drawImage(buffImgMaske, 0, 0,  350, 450, null);
    // und hier wieder einschalten?

ist es Möglich überhaupt Aktualisierung zu sperren?
 

Wolfgang Lenhard

Bekanntes Mitglied
Du kannst natürlich wie im Beispiel mit der ImageComponent zusätzliche Variablen einbauen (z. B. eine Klassenvariable boolean paint = true;) und dann in der paintComponent abfragen, ob bzw. was gezeichnet werden soll. Auf diese Weise lässt sich das gut regeln. Also in Deinem Beispiel etwas wie:

Code:
iGlobY = iGlobY+10;
   
    // Kann man hier die grafische Aktualisierung ausschalten?   
    gLabelImage.setRepaint(false);
    gLabelImage.clearRect(0, 0, 500, 500);
    gLabelImage.drawImage(buffImgOriginal, iGlobX, iGlobY,  iGlobWidth, iGlobHeight, null);
    gLabelMaske.drawImage(buffImgMaske, 0, 0,  350, 450, null);
    gLabelImage.setRepaint(true);    
// und hier wieder einschalten?

Den Setter musst Du natürlich in diesem Fall ebenfalls noch schreiben.
 

el_vital

Aktives Mitglied
Hallo Wolfgang,

ich habe das mit paintComponent nicht ganz verstanden. Wie müßte die setRepaint Funktion aussehen und wie kann ich in der paintComponent bestimmen, dass ein Panel nicht gezeichnet werden soll?
 

Wolfgang Lenhard

Bekanntes Mitglied
Ich kenne SuspendLayout nicht und kann Dir das also nicht beantworten. Wenn Du die paintComponent-Methode überschreiben möchtest, dann benötigst Du eine eigene Klasse, z. B. die unten stehende. Über Getter und Setter kannst Du regeln, was dann dort genau geschehen soll:

Code:
public class ImageComponent extends JComponent {
   private static final long serialVersionUID = -2077784274430624977L;
   private Image image = null;
   private boolean paintModus = true;

   public ImageComponent(Image image) {
      this.image = image;
   }

   public ImageComponent() {

   }

public void setPaintModus(boolean paintModus){
   this.paintModus = paintModus;
}

   public void setImage(Image image) {
      this.image = image;
      repaint();
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);

     //abfragen, ob das Bild gezeichnet werden soll
     if(paintModus){
      Graphics2D g2 = (Graphics2D) g;
      g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
      g2.setRenderingHint(RenderingHints.KEY_RENDERING,
            RenderingHints.VALUE_RENDER_QUALITY);
      if (image != null)
         g2.drawImage(image, 0, 0, getWidth(), getHeight(), null);
      
      g2.dispose();
      }
   }

}

Wenn Du setPaintModus(false) setzt, dann wird das Bild nicht gezeichnet, ansonsten schon. Schaue Dir mal die paintComponent an. Die entsprechende Abfrage findest Du dort.

Du kannst die Klasse natürlich beliebig erweitern, mehrere Bilder vorhalten, Bilder übereinander zeichnen etc. Ich gehe so teilweise vor, um Bilder mit Transparenzeffekten zu überlagern. Schaue Dir einmal Graphics2D an. Das bietet Dir viele Möglichkeiten.

Wenn Du möchtest, dann ein Panel gar nicht gezeichnet wird, dann müsstest Du es per setVisible(false) unsichtbar machen. Ich glaube aber nicht, dass es das ist, was Du möchtest.

Ciao,
Wolfgang

P.S.: Wenn Du die Zeile super.paintComponent(g); mit in die Klammer der If-Bedingung nimmst, dann würde die Komponente bei einem Repaint nicht neu gezeichnet werden, so wie das wohl beim SuspendLayout der Fall ist.
 

el_vital

Aktives Mitglied
ok, danke. Ich probiere es heute Abend aus. Ich glaube aber noch nicht, dass das die Lösung für das Problem ist. Ich möchte es ja zeichnen, aber die Darstellung halt erstmal nicht aktualisieren, sondern wenn alles gezeichnet ist, das dann auf einmal anzeigen. Bei deiner Methode würde doch wenn ich die Anzeige wieder zulasse auch nacheinander gezeichnet werden und das Flimmern wäre genau so da. Oder verstehe ich da noch was falsch?

Zu C#:

SuspendLayout => Unterbricht vorübergehend die Layoutlogik für das Steuerelement.

drauf beliebig in mehreren Schritten zeichnen

ResumeLayout => Nimmt die übliche Layoutlogik wieder auf. Und stellt alles gezeichnete auf einmal dar.
 

Wolfgang Lenhard

Bekanntes Mitglied
Du kannst das im obigen Code-Beispiel realisieren, indem Du das repaint() aus der Methode setImage herausnimmst, ein neues Bild übergibts und dann die Komponente zeichnen lässt (komponenteXYZ.repaint()). Da sollte eigentlich nichts flackern.
 

el_vital

Aktives Mitglied
irgend wie bekomme ich es nicht hin. Ich glaube, dass ich grundsätzlich einen falschen Ansatz habe.
Ich habe ein Panel mit Null Layout. Dem Panel füge ich nach einander zwei Labels zu. Auf dem unteren wird ein Bild angezeigt. Auf dem oberen die durchsichtige PNG-Datei. Wenn ich das untere Bild bewege oder vergrößere, dann muss ich das Bild und dann die Maske (PNG) neu zeichnen. Deswegen kommt es zu diesem Flimmern. Und ich kann die Tipps hier nicht umsetzen, damit es nicht flimmert und ich alles so machen kann wie ich es gerne würde.


Hier ist ein Beispiel: http://www.vs-multimedia.com/java/
Bewegt das Bild um zu sehen was ich meine.
 

el_vital

Aktives Mitglied
Ebenius hat gesagt.:
Nimm einfach ein Panel und zeichne die Images mit g.drawImage(...) übereinander.
eben ausprobiert. Flimmert genau so, weil es erst gelöscht und dann die zwei Bilder nacheinander gezeichnet werden müssen.
 

el_vital

Aktives Mitglied
André Uhres hat gesagt.:
Ich hab hier mal ein kleines Beispiel gemacht, das scheint gut zu funktionieren.
Man kann das grosse Bild verschieben:
ein Bild zu verschieben ist nicht das Problem. Das Problem ist ein Bild unter einem anderen zu verschieben und beide neu zu zeichnen ohne, dass das obere kurzfristig ausgeblendet wird und dadurch Flimmern verursacht wird.
Aber Offscreen-Image scheint mir der richtige Ansatz zu sein.
 

Ebenius

Top Contributor
Offscreen-Image ist meist der richtige Ansatz; besonders wenn es darum geht, dass komprimierte Bilder skaliert dargestellt werden sollen. Viel Erfolg!
 

el_vital

Aktives Mitglied
André Uhres hat gesagt.:
Doch, versuch's mal.
hab es eben ausprobiert. Es sieht gut aus, aber ich verstehe dein Code jetzt auf die schnelle nicht. Werde es mir heute Abend genauer anschauen und versuchen es in meinem Applet umzusetzen. Danke.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
E JavaFX Bild einfügen AWT, Swing, JavaFX & SWT 6
G paintComponents zerstückelt Bild AWT, Swing, JavaFX & SWT 0
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B JPanel und png-Bild AWT, Swing, JavaFX & SWT 2
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
C Bild in JFrame AWT, Swing, JavaFX & SWT 8
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
T Mit getSubimage ruckelt das Bild AWT, Swing, JavaFX & SWT 7
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
A Bild in JLabel skalieren AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
D Bild bewegen mit Tastendruck AWT, Swing, JavaFX & SWT 7
H Bild wird nicht angezeigt, Fehlercode unverständlich AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
S Bild skalieren AWT, Swing, JavaFX & SWT 3
D Bild in JFrame nur kurz da AWT, Swing, JavaFX & SWT 9
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
GianaSisters Bild wird S/W gespeichert. AWT, Swing, JavaFX & SWT 4
O Bild auf das JLabel AWT, Swing, JavaFX & SWT 10
D Swing Text auf Bild legen AWT, Swing, JavaFX & SWT 7
S Ein externes Bild in ein JFrame einfügen AWT, Swing, JavaFX & SWT 8
J Swing Bild wird nicht auf JLabel angezeigt AWT, Swing, JavaFX & SWT 12
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
R Bild in Bild finden AWT, Swing, JavaFX & SWT 4
B Bild bearbeiten mit Transparenz (spiegeln, Farben austauschen) AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben