Изменение размера изображения и отображение в JPanel или JLabel без потери качества

Я разрабатываю java-программу для захвата изображений сотрудников во время регистрации с помощью веб-камеры. Я могу получить изображение без каких-либо проблем и сохранить его на своем диске C :, но после извлечения изображения на этикетке отображается только часть изображения. Есть ли способ изменить формат JPEG перед его сохранением? или перед его отображением? как сокращение его без потери качества ….

Большое спасибо Cheerz! :)!

хорошо, ребята … здесь идет: – Я прокомментировал код так, как я их использовал.

//This method will capture the image from the interface and save it under the unique employee ID public String captureImage(int picId){ FrameGrabbingControl ControlFG = (FrameGrabbingControl) broadcast.getControl("javax.media.control.FrameGrabbingControl"); Buffer buffer = ControlFG.grabFrame(); BufferToImage image = new BufferToImage((VideoFormat)buffer.getFormat()); img = image.createImage(buffer); path="c:\\employee"+picId+".jpg"; saveJPG(img,path);//method will save the image return path; } public void saveJPG(Image img, String s){***//method will save the image*** System.out.println(s); BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D g2 = bi.createGraphics(); g2.drawImage(img,null,null); FileOutputStream out = null; try{ out = new FileOutputStream(s); } catch (java.io.FileNotFoundException io){ System.out.println("File Not Found"); } JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi); param.setQuality(0.5f,false); encoder.setJPEGEncodeParam(param); try { encoder.encode(bi); out.close(); } catch (java.io.IOException io) { System.out.println("IOException"); } } 

возможно, я могу масштабировать изображение при сохранении .. так что я могу получить масштабированное изображение ..

One Solution collect form web for “Изменение размера изображения и отображение в JPanel или JLabel без потери качества”

Конечно, вы можете resize изображения, есть много разных способов, таких как Image#getScaledInstance(int width,int height,int hints) , но у этого есть свои опасности .

Основная проблема:

Image.getScaledInstance () не возвращает готовое масштабированное изображение. Он оставляет большую часть масштабирования более поздним временем, когда используются пиксели изображения.

Я бы не рекомендовал его использовать, но вот хороший пример.

В качестве альтернативы вы можете использовать этот метод:

 import javax.swing.ImageIcon; import java.awt.image.BufferedImage; import java.awt.Image; import java.awt.Color; import java.awt.Graphics2D; import java.io.File; import javax.imageio.ImageIO; import java.awt.RenderingHints; public class ImgUtils { public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) { BufferedImage bi = null; try { ImageIcon ii = new ImageIcon(filename);//path to image bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY)); g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null); } catch (Exception e) { e.printStackTrace(); return null; } return bi; } } 

вы бы использовали его как:

 final BufferedImage img=new ImgUtils().scaleImage(200,200,"c:/test.jpg"); //create label with image as background JLabel label=new JLabel(new ImageIcon((Image)img)); 

ОБНОВИТЬ:

Вот небольшой пример, который я сделал:

введите описание изображения здесь

 import java.awt.BorderLayout; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; public class JavaApplication117 { //change this to your own static String filename="c:/test.jpg"; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new JavaApplication117().createAndShowUI(); } }); } private void createAndShowUI() { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initComponents(frame); frame.setResizable(false); frame.pack(); frame.setVisible(true); } private void initComponents(JFrame frame) { final BufferedImage img = new ImgUtils().scaleImage(200, 200, filename); //create label with image as background JLabel label = new JLabel(new ImageIcon((Image) img)); frame.getContentPane().add(label, BorderLayout.CENTER); } } class ImgUtils { public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) { BufferedImage bi = null; try { ImageIcon ii = new ImageIcon(filename);//path to image bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null); } catch (Exception e) { e.printStackTrace(); return null; } return bi; } } 

Рекомендации:

  • изменение размера изображения java getScaledInstance
  • Почему вы не должны расширять JFrame и другие компоненты?
  • Java: как сделать двойную буферизацию в Swing?
  • Как обновить данные в JTable Я использую TableModel
  • Java - Как подключиться к меню «Копировать и вставить» в Mac OS
  • Как сохранить настройки пользовательских настроек в Java?
  • Как реализовать перетаскиваемую вкладку с помощью Java Swing?
  • Java JTextField с подсказкой ввода
  • Мне нужно запустить JFrame из другого JFrame и запустить его как независимые приложения, помочь?
  • Использование шаблона наблюдателя в дизайне GUI JavaFX
  • Какое правильное действие при закрытии окон в java / swing?
  • Шаблон MVC и SWING
  • Давайте будем гением компьютера.