2012-09-30 23 views
5

Estoy desarrollando un programa java para capturar imágenes de los empleados en el momento del registro utilizando una cámara web. Puedo obtener la imagen sin ningún problema y guardarla en mi unidad C: pero al recuperar la imagen solo se muestra una parte de la imagen en la etiqueta. ¿Hay alguna manera de cambiar el tamaño del JPEG antes de guardarlo? o antes de mostrarlo? como encogiéndolo sin una pérdida de calidad ...Redimensionamiento y visualización de imágenes en un JPanel o un JLabel sin pérdida de calidad

Thankz mucho Cheerz! :)!

okay chicos ... aquí va: - He comentado el código en la forma en que los he usado.

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

tal vez pueda escalar la imagen mientras que el ahorro .. para que pueda recuperar la imagen escalada ..

+1

* "encogimiento sin una pérdida de calidad" * Eso no es posible. Varias técnicas de suavizado pueden ocultar en parte los artefactos del tamaño de la imagen, pero reducen la resolución en WxH y la "calidad" de la imagen debe ser menor. –

+0

@AndrewThompson Sí, eso es cierto ... una caída en la calidad está bien, pero no se muestra toda la imagen ... hasta ahora, solo una parte de la imagen encogida fue todo lo que pude obtener .. –

+0

Para una mejor ayuda antes, publíquela un [SSCCE] (http://sscce.org/). Quizás un enlace directo a una de [estas imágenes] (http://pscode.org/media/#image). –

Respuesta

12

Por supuesto, puede cambiar el tamaño de la imagen que hay muchas maneras diferentes, como Image#getScaledInstance(int width,int height,int hints), pero this has its perils.

El ser un problema principal:

Image.getScaledInstance() no devuelve una imagen terminada, escalado. Es deja gran parte del trabajo de escalado para un momento posterior cuando se utilizan los píxeles de la imagen .

No recomendaría su uso, pero here es un buen ejemplo.

Alternativamente, puede utilizar este método:

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

} 

que usaría gustaría:

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

ACTUALIZACIÓN:

Aquí hay un pequeño ejemplo que hice:

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

Referencias:

+1

muchas gracias por la respuesta rápida David! :)! –

+0

modifiqué el código ... para que la imagen almacenada en el búfer se muestre en una jlabel, pero aún así la imagen completa no se muestra en la etiqueta, probaría la anulación y le devolveré la respuesta .. ¡gracias de nuevo! :) ! –

+3

¿Hay alguna buena razón para extender 'JLabel' y no simplemente configurar la imagen como un ícono en' JLabel' sin otra cosa? – Robin

Cuestiones relacionadas