Amélioration de la qualité de l'image après une réduction de la taille en Java
Comme vous l'avez remarqué, redimensionner une image à une taille nettement plus petite peut entraîner une perte notable perte de qualité d’image. Pour remédier à ce problème, envisagez de mettre en œuvre les éléments suivants :
Approche Diviser pour mieux régner :
Au lieu de réduire l'image d'un seul coup, décomposez-la en étapes incrémentielles. Cela réduit le facteur d'échelle global, ce qui entraîne une meilleure qualité.
Rendu amélioré :
Dans votre méthode resizeImage(), assurez-vous de définir des conseils de rendu appropriés pour améliorer l'algorithme d'interpolation et la qualité de l'image. Pensez à utiliser des constantes telles que :
RenderingHints.VALUE_INTERPOLATION_BILINEAR RenderingHints.VALUE_RENDER_QUALITY RenderingHints.VALUE_ANTIALIAS_ON
Rééchantillonnage :
Expérimentez avec différents algorithmes de rééchantillonnage, tels que bicubique ou Lanczos, qui sont connus pour produire des résultats de meilleure qualité lors de la mise à l'échelle images vers le haut ou vers le bas.
Échantillon Code :
Voici une version révisée de votre code qui intègre les améliorations suggérées :
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; }
En implémentant ces améliorations, vous devriez constater une qualité d'image améliorée lors de la réduction de la taille des images, en particulier pour facteurs à plus grande échelle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!