图像resize并在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"); } } 

也许我可以在保存时缩放图像..这样我就可以检索缩放的图像..

当然你可以调整图像的大小,有很多不同的方法,比如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的大小