G
Guest
Gast
Hallo ich hab ein kleines Problem,
mal schauen ob Ihr mir helfen könnt. Zumindestens wäre das sehr nett und hilfreich.
Mein Problem ist es das das scalieren nicht so richtig funktioniert.
Wenn das bild länger ist als die breite (z.B. bild einer Ampel), dann scaliert er falsch und zwar größer. Aber das verhältnis bleibt richtig.
Wenn aber das bild breiter ist als die länge, was die meißten bilder ja sind, dann funktioniert das richtig.
Der benutzer kann die fenstergröße ändern, also "f.setResizable(true);"
und darauf geh ich ein und scaliere das bild so, das alles zu sehen ist und das verhältnis bleibt auch richtig. Natürlich mach ich das nur wenn das bild auch wirklich größer ist.
Danke.
mal schauen ob Ihr mir helfen könnt. Zumindestens wäre das sehr nett und hilfreich.
Mein Problem ist es das das scalieren nicht so richtig funktioniert.
Wenn das bild länger ist als die breite (z.B. bild einer Ampel), dann scaliert er falsch und zwar größer. Aber das verhältnis bleibt richtig.
Wenn aber das bild breiter ist als die länge, was die meißten bilder ja sind, dann funktioniert das richtig.
Der benutzer kann die fenstergröße ändern, also "f.setResizable(true);"
und darauf geh ich ein und scaliere das bild so, das alles zu sehen ist und das verhältnis bleibt auch richtig. Natürlich mach ich das nur wenn das bild auch wirklich größer ist.
Danke.
Code:
int bild_hoehe = tmp1.getIconHeight();
int bild_breite = tmp1.getIconWidth();
//ermittle die Hoehe und Breite des Fensters
getFenster_size(f);
// uebernehme die Hoehe und Breite des Fensters und veraendere diese
int neue_fensterhoehe = hoehe_Fenster;
int neue_festerbreite = breite_Fenster;
neue_fensterhoehe -= 55; //mindern der hoehe wegen der Statusleiste und Menubarleiste
neue_festerbreite -= 150; //mindern der breite wegen der Voransicht der Bilder
System.out.println("bild_hoehe: " + bild_hoehe);
System.out.println("bild_breite: " + bild_breite);
System.out.println("neue_fensterhoehe: " + neue_fensterhoehe);
System.out.println("neue_festerbreite: " + neue_festerbreite);
// pruefe ob eine Seite laenger ist als die Seite des Label
if (bild_hoehe > neue_fensterhoehe || bild_breite > neue_festerbreite)
{
// if (bild_hoehe > neue_fensterhoehe)
// {
// System.out.println("bildhoehe ist groesser als festerhoehe");
// }
// if (bild_breite > neue_festerbreite)
// {
// System.out.println("bildbreite ist groesser als festerbreite");
// }
// ermitteln welche seite vom bild laenger ist
int laengste_seite_von_bild;
if (bild_hoehe > bild_breite) laengste_seite_von_bild = bild_hoehe;
else laengste_seite_von_bild = bild_breite;
// wenn die laengste Seite vom bild die breite ist, dann muss ich auch zum scalieren die Fensterbreite nehmen,
// sonst wuerde das scalieren nicht funktionieren und das ganze auch andersrum mit der hoehe
int ausgewaelte_fensterseite;
if (laengste_seite_von_bild == bild_breite) ausgewaelte_fensterseite = neue_festerbreite;
else ausgewaelte_fensterseite = neue_fensterhoehe;
// bilde den rechnungsfaktor mit dem ich dann das bild scaliere und
// speichere das in float sonst waere es zu ungenau
float rechnungsfaktor = (float) laengste_seite_von_bild / ausgewaelte_fensterseite;
// ermittle die breite und hoehe auf der das Bild scaliert werden muss
float die_scalierte_bildbreite_float = bild_breite / rechnungsfaktor;
float die_scalierte_bildhoehe_float = bild_hoehe / rechnungsfaktor;
// die breite und hoehe auf der das Bild scaliert werden muss, muessen jetzt in int umgewandelt werden
int die_scalierte_bildbreite = (int) die_scalierte_bildbreite_float;
int die_scalierte_bildhoehe = (int) die_scalierte_bildhoehe_float;
// wenn das bild immer noch zu gross ist fuer das fenster dann scaliere nochmal
if (die_scalierte_bildhoehe > neue_fensterhoehe || die_scalierte_bildbreite > neue_festerbreite)
{
// ermitteln welche seite vom bild kuerzer ist
int kuerzeste_seite_von_bild;
if (bild_hoehe < bild_breite) kuerzeste_seite_von_bild = die_scalierte_bildhoehe;
else kuerzeste_seite_von_bild = die_scalierte_bildbreite;
// wenn die kuerzeste Seite vom bild die breite ist, dann muss ich auch zum scalieren die Fensterbreite nehmen,
// sonst wuerde das scalieren nicht funktionieren und das ganze auch andersrum mit der hoehe
int ausgewaelte_fensterseite2;
if (kuerzeste_seite_von_bild == bild_breite) ausgewaelte_fensterseite2 = neue_festerbreite;
else ausgewaelte_fensterseite2 = neue_fensterhoehe;
rechnungsfaktor = (float) kuerzeste_seite_von_bild / ausgewaelte_fensterseite2;
// ermittle die breite und hoehe auf der das Bild scaliert werden muss
die_scalierte_bildbreite_float = die_scalierte_bildbreite / rechnungsfaktor;
die_scalierte_bildhoehe_float = die_scalierte_bildhoehe / rechnungsfaktor;
// die breite und hoehe auf der das Bild scaliert werden muss, muessen jetzt in int umgewandelt werden
die_scalierte_bildbreite = (int) die_scalierte_bildbreite_float;
die_scalierte_bildhoehe = (int) die_scalierte_bildhoehe_float;
}
// scaliert das Bild //breite, hoehe, hints
scaled2 = ActiveImage.getScaledInstance(die_scalierte_bildbreite, die_scalierte_bildhoehe, Image.SCALE_FAST);
}
// konvertiert das bild wieder in ImageIcon
ImageIcon scaliertes_bild;
if(scaled2 != null) //wenn das bild scalieret wurde
{
scaliertes_bild = new ImageIcon(scaled2);
scaled2 = null;
}
else //wenn es nicht noetig war das bild zu scalieren
{
scaliertes_bild = new ImageIcon(ActiveImage);
}
// lege das ImageIcon auf ein Label
l1.setIcon(scaliertes_bild);