Dodanie do punktu Erika dotyczącego getScaledInstance, jeśli odszedłeś od niego do korzystania z zalecanych mechanizmów skalowania w Java2D, mogłeś zauważyć, że twoje obrazy wyglądają znacznie gorzej.
Powodem tego jest, gdy Java2D zniechęcony wykorzystanie getScaledInstance i AreaAveragingScaleFilter, nie zastąpić go czymś jako łatwego korzystać w API, zamiast zostaliśmy do naszych własnych urządzeń za pomocą Java2D API bezpośrednio. Na szczęście Chris Campbell (z zespołu J2D) podjął decyzję o zastosowaniu techniki przyrostowego skalowania, która daje podobne rezultaty do AreaAveragingScaleFilter i działa szybciej; niestety kod ma przyzwoity rozmiar i nie odnosi się do pierwotnej kwestii uhonorowania proporcji.
Około 6 miesięcy temu ciągle widziałem te wszystkie pytania na temat "skalowania obrazów w Javie" i ostatecznie zebrałem wszystkie rady, wykonałem wszystkie kopanie i badania, jakie mogłem, i skompilowałem wszystko w jeden "najlepszy" praktyki "image scaling library.
Interfejs API jest prosty, ponieważ jest to tylko jedna klasa i kilka statycznych metod.Użytkowanie podstawowe wygląda następująco:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 320);
To simplest call gdzie biblioteka wykorzysta najlepiej odgadnąć jakości, honorować swoje proporcje obrazu i dopasować wynik w oknie 320x320 ograniczenia. UWAGA, ramka ograniczająca jest po prostu maksymalną wartością W/H, ponieważ proporcje obrazu są honorowane, wynikowy obraz nadal będzie honorował to, powiedzmy 320x200.
Jeśli chcesz zastąpić tryb automatyczny i zmusić go do uzyskania najlepszego wyniku, a nawet zastosować bardzo łagodny filtr antyaliasingowy, aby wyglądał jeszcze lepiej (szczególnie dobrze dla miniatur), to połączenie będzie wyglądać następująco:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
150, 100, Scalr.OP_ANTIALIAS);
Są to tylko przykłady, API jest szeroki i obejmuje wszystko, od bardzo prostych przypadków użycia do bardzo specjalistycznych. Możesz nawet przekazać swoje własne BufferedImageOps, które mają być zastosowane do obrazu (a biblioteka automatycznie naprawi dla ciebie sześcioletni błąd BufferedImageOp JDK!).
Jest dużo więcej rzeczy do skalowania obrazów w Javie z powodzeniem, że biblioteka robi dla ciebie, na przykład zawsze utrzymując obraz w jednym z najlepiej obsługiwanych typów obrazu RGB lub ARGB podczas pracy na nim. Pod pokrywami potok przetwarzania obrazu Java2D cofa się do gorszego oprogramowania, jeśli typ obrazu wykorzystywany do jakichkolwiek operacji na obrazie jest słabo obsługiwany.
Jeśli wszystko to brzmi jak ból głowy, to jest coś takiego ... dlatego napisałem bibliotekę i otworzyłem ją, więc ludzie mogli zmienić rozmiar swoich zdjęć i przejść do ich życia bez konieczności martwienia się o to.
Nadzieję, że pomaga.
tak źle jej getHeight literówka jest jakiś powód, dla którego nie mogę używać getScaledInstance z BufferdImage? – user63898
To powinno być w porządku, ponieważ BufferedImage rozszerza Image – Max
Hah, dziękuję za to pierwsze równanie. Zrobiłem coś, co kliknę w mój zdezorientowany mózg! – Cameron