Phil, ich weiß nicht, welche Lösung letztendlich Sie ging mit, aber Skalieren von Bildern in Java kann ziemlich gut aussehen, wenn Sie:
- Vermeiden BufferedImage Typen, die vom JDK nicht gut unterstützt werden.
- Verwenden inkrementelle
- Stick-Skalierung auf Bikubisch wenn inkrementelle mit Skalierung
ich einen fairen Anteil an Tests mit diesen Methoden und die inkrementelle Skalierung zusammen mit Festhalten an gut unterstützten Bildtypen getan haben, ist der Schlüssel - - Ich sehe, dass Alexander erwähnt hat, dass er immer noch kein Glück damit hat, was ein Mist ist.
Ich veröffentlichte die imgscalr library (Apache 2) vor etwa 6 Monaten, um das Problem von "Ich möchte gut aussehende skalierte Kopien dieses Bildes, DO IT NOW!" nach dem Lesen von etwa 10 Fragen wie diese auf SO.
Standardverwendung wie folgt aussieht:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 640);
Das zweite Argument der Begrenzungsbreite und -höhe ist imgscalr das Bild skaliert verwenden - seine Proportionen zu halten richtig, auch wenn Sie in einem ungültigen Dimensionen bestanden - es gibt viele more detailed methods, aber das ist die einfachste Verwendung.wenn Facebook begrenzte Bilder auf 800x600 Pixel
Der Use-Case Sie würden zum Beispiel wollen, würde wie folgt aussehen:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 800, 600);
Das wird dafür sorgen, das Bild bleibt im besten unterstützten Bildtyp und mit der skalierte höchste Qualitätsmethode, die Java aufbringen kann.
In meinem eigenen hochauflösenden Test habe ich keine klaffenden Diskrepanzen mit skalierten Bildern mit dieser Bibliothek/diesen Methoden bemerkt, AUSSER wenn Ihr Bild vom ImageIO Loader in einen schlecht unterstützten Bildtyp versetzt wird - zum Beispiel passiert dies viel mit GIFs. Wenn du sie so belässt und sie nicht aus diesen schlecht unterstützten Typen herausholst, sieht es am Ende aus, als ob sie wirklich gechoppt und schrecklich wären. Der Grund dafür ist, dass das Java2D-Team tatsächlich über verschiedene hardwarebeschleunigte Pipelines für alle Arten von BufferedImages verfügt, die das JDK verarbeiten kann - eine Untergruppe der weniger gebräuchlichen Bildtypen verwendet dieselbe Software Rendering-Pipeline unter den Abdeckungen in Java2D, was zu schlechten und manchmal völlig inkorrekt aussehenden Bildern führt. Das war so ein PIA zu erklären und zu versuchen herauszufinden, dass ich diese Logik direkt in die Bibliothek geschrieben habe.
Die beiden besten unterstützten Typen sind BufferedImage.TYPE_INT_RGB und _ARGB wenn Sie neugierig sind.
Ich hatte gehofft, einen externen Anruf zu vermeiden, aber ich denke, dass Sie Recht haben können. Java scheint noch nicht ganz richtig Bildverarbeitung zu haben! –
Das ist auch meine Schlussfolgerung! Java-Bild apis nur saugen! Ich kann die Trägheit umgehen, aber die schlechte Bildqualität ist einfach nicht akzeptabel! Ich hoffe, dass die relevanten Apis zusammen mit JavaFX 2.0 ein dringend benötigtes TLC bekommen. – Kimble
Sie sind offensichtlich nicht auf [java-image-scaling] (http://code.google.com/p/java-image-scaling/) gestoßen. –