Heim >Java >javaLernprogramm >Wie kann ich die Bildqualität nach dem Downsizing in Java verbessern?
Verbesserung der Bildqualität nach der Verkleinerung in Java
Wie Sie bemerkt haben, kann die Größenänderung eines Bildes auf eine deutlich kleinere Größe zu einem spürbaren Ergebnis führen Verlust der Bildqualität. Um dieses Problem zu beheben, sollten Sie Folgendes implementieren:
Teile-und-herrsche-Ansatz:
Anstatt das Bild auf einmal zu verkleinern, teilen Sie es in inkrementelle Schritte auf. Dadurch wird der Gesamtskalierungsfaktor reduziert, was zu einer besseren Qualität führt.
Verbessertes Rendering:
Stellen Sie in Ihrer resizeImage()-Methode sicher, dass Sie geeignete Rendering-Hinweise zur Verbesserung festlegen der Interpolationsalgorithmus und die Bildqualität. Erwägen Sie die Verwendung von Konstanten wie:
RenderingHints.VALUE_INTERPOLATION_BILINEAR RenderingHints.VALUE_RENDER_QUALITY RenderingHints.VALUE_ANTIALIAS_ON
Resampling:
Experimentieren Sie mit verschiedenen Resampling-Algorithmen wie Bicubic oder Lanczos, die bekanntermaßen bei der Skalierung qualitativ hochwertigere Ergebnisse liefern Bilder nach oben oder unten.
Beispiel Code:
Hier ist eine überarbeitete Version Ihres Codes, die die vorgeschlagenen Verbesserungen enthält:
public static Boolean resizeImage(String sourceImg, String destImg, Integer Width, Integer Height, Integer whiteSpaceAmount) { BufferedImage origImage; try { origImage = ImageIO.read(new File(sourceImg)); int type = origImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : origImage.getType(); int fHeight = Height; int fWidth = Width; int whiteSpace = Height + whiteSpaceAmount; double aspectRatio; // Determine resized dimensions if (origImage.getHeight() > origImage.getWidth()) { fHeight = Height; aspectRatio = (double)origImage.getWidth() / (double)origImage.getHeight(); fWidth = (int)Math.round(Width * aspectRatio); } else { fWidth = Width; aspectRatio = (double)origImage.getHeight() / (double)origImage.getWidth(); fHeight = (int)Math.round(Height * aspectRatio); } BufferedImage scaledImage = new BufferedImage(whiteSpace, whiteSpace, type); Graphics2D g = scaledImage.createGraphics(); g.setColor(Color.white); g.fillRect(0, 0, whiteSpace, whiteSpace); g.setComposite(AlphaComposite.Src); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Instead of scaling directly to fHeight/fWidth, do it in steps int step = 2; while (fHeight > 0 && fWidth > 0) { g.drawImage(origImage, (whiteSpace - fWidth)/2, (whiteSpace - fHeight)/2, fWidth, fHeight, null); origImage = scaledImage; fWidth /= step; fHeight /= step; } g.dispose(); ImageIO.write(scaledImage, "jpg", new File(destImg)); } catch (IOException ex) { return false; } return true; }
Durch die Implementierung dieser Verbesserungen sollten Sie eine verbesserte Bildqualität beim Verkleinern von Bildern sehen, insbesondere für größere Skalenfaktoren.
Das obige ist der detaillierte Inhalt vonWie kann ich die Bildqualität nach dem Downsizing in Java verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!