Java 9 Multi-Resolution Image API: Responsive Grafiken mit mehreren Auflösungen
Was ist die Multi-Resolution Image API?
Java 9 führt java.awt.image.MultiResolutionImage (Interface) und BaseMultiResolutionImage (Basis-Implementierung) ein. Sie ermöglichen, ein logisches Bild darzustellen, das physisch aus mehreren Auflösungsvarianten besteht. Die Laufzeit wählt automatisch die beste Variante für die angeforderte Darstellungsgröße.
Kern-Methoden
| Methode | Beschreibung |
|---|---|
getResolutionVariant(double w, double h) |
Liefert die beste Variante für Zielgröße w x h. |
getResolutionVariants() |
Liefert read-only Liste aller Varianten. |
Beispiel: Drei Logo-Varianten laden & nutzen
import java.awt.Image;
import java.awt.image.BaseMultiResolutionImage;
import java.awt.image.MultiResolutionImage;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import javax.imageio.ImageIO;
public class MultiResDemo {
public static void main(String[] args) throws IOException {
// URLs zu verschiedenen Auflösungen desselben Logos
List<String> urls = List.of(
"https://example.com/logo.png", // Basis
"https://example.com/logo@2x.png", // 2x (Retina)
"https://example.com/logo@3x.png" // 3x
);
// Alle Bilder laden
List<Image> images = urls.stream()
.map(url -> ImageIO.read(new URL(url)))
.toList();
// MultiResolutionImage erstellen
MultiResolutionImage mri = new BaseMultiResolutionImage(
images.toArray(new Image[0])
);
// Alle Varianten auflisten
List<Image> variants = mri.getResolutionVariants();
System.out.println("Anzahl Varianten: " + variants.size());
variants.forEach(img ->
System.out.printf(" %dx%d%n", img.getWidth(null), img.getHeight(null))
);
// Auflösungsspezifische Variante abfragen
Image v1 = mri.getResolutionVariant(100, 100);
Image v2 = mri.getResolutionVariant(300, 300);
Image v3 = mri.getResolutionVariant(600, 600);
System.out.printf("Für 100x100: %dx%d%n", v1.getWidth(null), v1.getHeight(null));
System.out.printf("Für 300x300: %dx%d%n", v2.getWidth(null), v2.getHeight(null));
System.out.printf("Für 600x600: %dx%d%n", v3.getWidth(null), v3.getHeight(null));
}
}
Typische Ausgabe
Anzahl Varianten: 3
100x100
300x300
600x600
Für 100x100: 100x100
Für 300x300: 300x300
Für 600x600: 600x600
Anwendungsfälle
- HiDPI/Retina Support: Swing/JavaFX Apps sehen auf High-DPI-Schirmen scharf aus.
- Responsive Web-Apps (Java Backend): Server liefert passende Auflösung basierend auf Client-Viewport.
- Icons & Thumbnails: Ein logisches Icon, physisch mehrere Größen (16, 32, 64, 128, 256 px).
- Druck vs. Screen: Hochauflösende Variante für Druck, niedrigere für Bildschirm.
Wichtige Hinweise
- Die API wählt die Variante, deren Größe ≥ angeforderter Größe ist (upscaling wird vermieden).
- Reihenfolge der Varianten im Konstruktor ist egal – Auswahl erfolgt nach Größe.
- Alle Varianten müssen dasselbe Seitenverhältnis haben (sonst unerwartete Ergebnisse).
- Funktioniert mit
Graphics.drawImage(), JavaFXImageView(viaSwingFXUtils).
Fazit
Die Multi-Resolution Image API löst ein langjähriges Problem bei der Skalierung von Rastergrafiken in Java-Desktop-Apps – deklarativ, performant & standardkonform.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
- Java 9 (JDK 9): Wichtigste Features & Vorteile – Modularität, JShell, HTTP/2 & mehr