2012-09-30 6 views
5

Ich entwickle ein Java-Programm, um Mitarbeiterbilder zum Zeitpunkt der Registrierung mit einer Webcam zu erfassen. Ich kann das Bild ohne Probleme erhalten und es in meinem C: Laufwerk speichern, aber beim Abrufen des Bildes wird nur ein Teil des Bildes auf dem Etikett angezeigt. Gibt es eine Möglichkeit, die JPEG-Größe zu ändern, bevor Sie sie speichern? oder bevor es angezeigt wird? wie schrumpfen es ohne einen Qualitätsverlust ....Bildgrößenanpassung und Anzeige in einem JPanel oder einem JLabel ohne Qualitätsverlust

Vielen Dank Cheerz! :)!

okay Jungs ... hier geht: - Ich habe den Code in der Art, wie ich sie benutzt habe kommentiert.

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

vielleicht kann ich das Bild skalieren, während .. Speichern, so dass ich das skalierte Bild abrufen kann ..

+1

* "es ohne Qualitätsverlust schrumpfen" * Das ist nicht möglich. Verschiedene Glättungstechniken können teilweise die Artefakte der Bildgrößenänderung verbergen, aber die Auflösung in WxH verringern und die Bildqualität muss geringer sein. –

+0

@AndrewThompson yeah das ist wahr .... ein Rückgang der Qualität ist in Ordnung, aber das gesamte Bild wird nicht angezeigt ... bis jetzt nur ein Teil des geschrumpften Bild war alles, was ich erhalten konnte .. –

+0

Für bessere Hilfe früher, nach an [SSCCE] (http://sscce.org/). Vielleicht Hot-Link zu einem dieser [Bilder] (http://pscode.org/media/#image). –

Antwort

12

Natürlich können Sie die Größe des Bildes kann es viele verschiedene Möglichkeiten, wie Image#getScaledInstance(int width,int height,int hints), aber this has its perils.

Das Hauptproblem Wesen:

Image.getScaledInstance() nicht um ein fertiges, skalierte Bild zurückzukehren. Es lässt viel von der Skalierung für eine spätere Zeit, wenn die Bildpixel verwendet werden.

Ich würde es nicht empfehlen, aber here ist ein schönes Beispiel.

Alternativ können Sie diese Methode verwenden:

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

} 

es Ihnen gefällt verwenden würde:

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:

Hier ist ein kleines Beispiel, das ich gemacht:

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

Referenzen:

+1

vielen Dank für die schnelle Antwort David! :)! –

+0

ich habe den code geändert ... so dass das gepufferte bild auf einem jlabel angezeigt wird, aber immer noch wird das ganze bild nicht auf dem label angezeigt, ich würde versuchen das override und komme wieder zurück .. danke nochmal! :) ! –

+3

Gibt es einen guten Grund, 'JLabel' zu verlängern und das Bild nicht einfach als Symbol auf' JLabel' zu setzen? – Robin

Verwandte Themen