2012-09-30 14 views
5

Sto sviluppando un programma java per acquisire immagini dei dipendenti al momento della registrazione utilizzando una webcam. Posso ottenere l'immagine senza problemi e salvarla nella mia C: drive ma al momento del recupero dell'immagine solo una parte dell'immagine viene visualizzata sull'etichetta. C'è un modo per ridimensionare il JPEG prima di salvarlo? o prima di visualizzarlo? come ridurlo senza una perdita di qualità ....Ridimensionamento e visualizzazione delle immagini in JPanel o JLabel senza perdita di qualità

Thankz molto Cheerz! :)!

ok ragazzi ... ecco qui: - Ho commentato il codice nel modo in cui li ho usati.

//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"); 
    } 
    } 

forse posso scalare l'immagine, mentre il risparmio .. in modo che possa recuperare l'immagine in scala ..

+1

* "contrazione senza una perdita di qualità" * Questo non è possibile. Varie tecniche di smoothing possono in parte nascondere gli artefatti del ridimensionamento dell'immagine, ma ridurre la risoluzione in WxH e la 'qualità' dell'immagine deve essere inferiore. –

+0

@AndrewThompson sì è vero .... un calo di qualità va bene, ma l'intera immagine non viene visualizzata ... finora solo una parte dell'immagine ridotta era tutto quello che potevo ottenere .. –

+0

Per un aiuto migliore prima, post un [SSCCE] (http://sscce.org/). Forse hot-link a una di queste [immagini] (http://pscode.org/media/#image). –

risposta

12

Naturalmente è possibile ridimensionare l'immagine ci sono molti modi diversi, come Image#getScaledInstance(int width,int height,int hints), ma this has its perils.

Il problema principale è:

Image.getScaledInstance() non restituisce un'immagine finita, scalato. Lo lascia la maggior parte del lavoro di ridimensionamento per un momento successivo quando vengono utilizzati i pixel dell'immagine .

Non mi consiglia di utilizzarlo ma here è un bell'esempio.

In alternativa è possibile utilizzare questo metodo:

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

} 

Faresti utilizzare come:

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:

Ecco un piccolo esempio che ho fatto:

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

Riferimenti:

+1

grazie mille per la rapida risposta David! :)! –

+0

ho modificato il codice ... in modo che l'immagine bufferizzata restituita sia visualizzata su una jlabel, ma l'immagine intera non viene visualizzata sull'etichetta, proverei l'override e torno indietro .. grazie ancora! :) ! –

+3

C'è una buona ragione per estendere 'JLabel' e non semplicemente impostare l'immagine come un'icona su' JLabel' senza altro? – Robin

Problemi correlati