Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Meningkatkan Kualiti Imej Selepas Mengecilkan Saiz di Java?
Meningkatkan Kualiti Imej selepas Mengecilkan Saiz di Java
Seperti yang anda perhatikan, mengubah saiz imej kepada saiz yang lebih kecil dengan ketara boleh menyebabkan ketara kehilangan kualiti imej. Untuk membetulkan isu ini, pertimbangkan untuk melaksanakan perkara berikut:
Pendekatan Bahagi dan Takluk:
Daripada mengecilkan imej sekali gus, pecahkannya kepada langkah-langkah tambahan. Ini mengurangkan faktor skala keseluruhan, menghasilkan kualiti yang lebih baik.
Perenderan Dipertingkat:
Dalam kaedah resizeImage() anda, pastikan anda menetapkan pembayang pemaparan yang sesuai untuk dipertingkatkan algoritma interpolasi dan kualiti imej. Pertimbangkan untuk menggunakan pemalar seperti:
RenderingHints.VALUE_INTERPOLATION_BILINEAR RenderingHints.VALUE_RENDER_QUALITY RenderingHints.VALUE_ANTIALIAS_ON
Pensampelan Semula:
Percubaan dengan algoritma pensampelan semula yang berbeza, seperti bikubik atau Lanczos, yang diketahui menghasilkan hasil yang lebih berkualiti apabila penskalaan imej atas atau bawah.
Sampel Kod:
Berikut ialah versi semakan kod anda yang menggabungkan penambahbaikan yang dicadangkan:
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; }
Dengan melaksanakan penambahbaikan ini, anda seharusnya melihat kualiti imej yang lebih baik apabila mengecilkan imej, terutamanya untuk faktor skala yang lebih besar.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meningkatkan Kualiti Imej Selepas Mengecilkan Saiz di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!