Il ridimensionamento delle immagini e la visualizzazione in un JPanel o un JLabel senza perdita di qualità

Sto sviluppando un programma java per la cattura dei dipendenti immagini al momento della registrazione utilizzando una webcam. Sono in grado di ottenere l’immagine senza alcun problema, e salvarlo nel mio disco C: ma al momento del recupero dell’immagine solo una parte dell’immagine viene visualizzato sull’etichetta. C’è un modo di ri dimensionamento JPEG prima di salvarlo? o prima della visualizzazione? la riduzione è senza perdita di qualità….

Thankz un sacco
Cheerz!
:)!

ok ragazzi… qui va:- ho commentato il codice nel modo che ho usato.

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

magari riesco a ridimensionare l’immagine, mentre il risparmio.. in modo che io possa recuperare l’immagine in scala..

“il restringimento senza perdita di qualità” Che non è possibile. Varie tecniche di perequazione può in parte nascondere gli artefatti di immagine ridimensiona, ma abbassare la risoluzione a Lxa e l’immagine ‘la qualita’ deve essere di meno.
sì è vero…. un calo di qualità è bene, ma l’intera immagine non viene visualizzata…finora solo una parte del ristretto immagine era tutto quello che potevo ottenere..
Per aiutare meglio prima, nel post SSCCE. Forse hot-link a uno dei immagini.
Per aiutare meglio prima (oltre a fornire un SSCCE, come già detto da @AndrewThompson) prova a leggere la tua domanda piacevole da a) apprendimento e di attaccare a java convenzioni di denominazione b) completamente (e in modo coerente!) la formattazione del codice (c’è un pulsante di aiuto che viene fornito con un how-to quando si fa clic 🙂
se siete veramente interessati alla qualità, non c’è alcun modo per aggirare la lettura su basi di graphics2D opzioni, f.io. presto il blog today.java.net/pub/a/today/2007/04/03/… o filtyRichClients

InformationsquelleAutor Dilshan Ranaweera | 2012-09-30

One Reply
  1. 12

    Naturalmente, è possibile ridimensionare l’immagine, ci sono molti modi diversi, come Immagine#getScaledInstance(int width,int height,int suggerimenti), ma questo ha i suoi pericoli.

    Il problema:

    Immagine.getScaledInstance() non restituisce un prodotto finito, immagine a scala. Si
    lascia molto di scala lavoro per un secondo momento, quando i pixel dell’immagine,
    sono utilizzati.

    Vorrei raccomandare di non usarlo, ma qui, è un ottimo 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;
    }
    
    }

    che si potrebbe 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));

    AGGIORNAMENTO:

    Ecco un piccolo esempio che ho fatto:

    Il ridimensionamento delle immagini e la visualizzazione in un JPanel o un JLabel senza perdita di qualità

    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:

    grazie mille per la rapida risposta di David! :)!
    C’è una buona ragione per estendere JLabel e non semplicemente impostando l’immagine come icona sul JLabel senza nient’altro ?
    vedere aggiornamento
    poi un’altra cosa è la colpa. Vedere il mio upadate. Se ancora non funziona, quindi io suggerirei di postare un SSCCE
    attenzione: la qualità detoriates se la ridimensionato con altezza inferiore a circa la metà di quelle originali ..

    InformationsquelleAutor David Kroukamp

Lascia un commento