2012-09-30 73 views
5

我正在開發一個Java程序捕捉僱員圖像在註冊時使用網絡攝像頭。我可以沒有任何問題地獲得照片,並將其保存在C:驅動器中,但是在檢索圖像時,只有部分圖像顯示在標籤上。在保存之前是否有一種重新設定JPEG的方法?或在顯示之前?像收縮它沒有質量損失....圖像大小調整和顯示在JPanel或JLabel沒有質量損失

Thankz很多 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"); 
    } 
    } 

也許我可以在節省縮放圖像..所以,我可以檢索縮放後的圖像..

+1

*這是不可能的 「無質量損失縮小它。」各種平滑技術可以部分隱藏圖像調整大小的文物,但降低WxH的分辨率,並且圖像的「質量」必須更低。 –

+0

@AndrewThompson是的,這是真的....質量的下降是好的,但整個圖像沒有得到顯示...迄今爲止,只有縮小的圖像的一部分是我可以獲得.. –

+0

爲了更好地幫助更快,發佈[SSCCE](http://sscce.org/)。也許熱鏈接到[這些圖像](http://pscode.org/media/#image)之一。 –

回答

12

當然,你可以調整圖片的大小有喜歡Image#getScaledInstance(int width,int height,int hints),但this has its perils許多不同的方式。

的主要問題存在:

Image.getScaledInstance()不返回成品,縮放的圖像。當使用圖像像素 時,它會在稍後的時間留下大部分縮放工作。

我不會推薦使用它,但here就是一個很好的例子。

另外,您可以使用此方法:

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)); 

UPDATE:

這裏是我做了一個小例子:

enter image description here

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; 
    } 
} 

參考文獻:

+1

非常感謝David的快速反應! :)! –

+0

我修改了代碼......以便返回的緩存圖像顯示在jlabel上,但仍然沒有顯示完整圖像,我會嘗試重寫並取回你的..再次感謝!:) ! –

+3

是否有很好的理由來擴展'JLabel',而不是簡單地將圖像設置爲'JLabel'上的圖標而沒有其他任何東西? – Robin