Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel或JLabel中调整图像大小并显示,而不会降低质量_Java_Swing_Jpanel_Jpeg_Jlabel - Fatal编程技术网

Java 在JPanel或JLabel中调整图像大小并显示,而不会降低质量

Java 在JPanel或JLabel中调整图像大小并显示,而不会降低质量,java,swing,jpanel,jpeg,jlabel,Java,Swing,Jpanel,Jpeg,Jlabel,我正在开发一个java程序,使用网络摄像头在注册时捕获员工的图像。我可以毫无问题地获取图片,并将其保存在我的C:驱动器中,但在检索图像时,标签上仅显示图像的一部分。有没有办法在保存JPEG之前重新调整其大小?还是在展示之前?就像在没有质量损失的情况下缩小它 非常感谢 干杯! :)! 好了,伙计们。。。下面是:-我已经以我使用它们的方式对代码进行了注释 //This method will capture the image from the interface and save it under

我正在开发一个java程序,使用网络摄像头在注册时捕获员工的图像。我可以毫无问题地获取图片,并将其保存在我的C:驱动器中,但在检索图像时,标签上仅显示图像的一部分。有没有办法在保存JPEG之前重新调整其大小?还是在展示之前?就像在没有质量损失的情况下缩小它

非常感谢 干杯! :)!

好了,伙计们。。。下面是:-我已经以我使用它们的方式对代码进行了注释

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

也许我可以在保存时缩放图像。。这样我就可以检索缩放后的图像

当然可以调整图像大小,有很多不同的方法,例如,但是

主要问题是:

GetScaleInstance()不返回已完成的缩放图像。信息技术 将大部分缩放工作留到以后图像像素 都用过了

我不建议使用它,但这是一个很好的例子

或者,您可以使用以下方法:

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));
更新:

下面是我举的一个小例子:

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

参考文献:


我修改了代码。。。因此,返回的缓冲图像显示在jlabel上,但完整图像仍不显示在标签上,我将尝试重写并返回给您。。再次感谢!:)!是否有充分的理由扩展
JLabel
,而不只是将图像设置为
JLabel
上的图标,而不做任何其他操作?@DavidKroukamp没有,图像仍然没有缩小。。。仅显示图像的一部分@迪尔尚拉纳韦拉:那么是别的原因造成的。看我的upadate。如果它仍然不起作用,那么我建议发布一个警告:如果缩小的尺寸/高度小于原始尺寸的一半,则质量会下降。这是不可能的。各种平滑技术可以部分隐藏图像大小调整的伪影,但WxH中的分辨率较低,图像的“质量”必须较低。@AndrewThompson是的,这是真的。。。。质量下降是可以的,但是整个图像没有显示出来…到目前为止,我只能得到缩小图像的一部分..为了更快地获得更好的帮助,请发布一个。可能是其中一个的热链接。为了更快地获得更好的帮助(除了提供SSCCE,正如@AndrewThompson已经提到的),请尝试通过a)学习并坚持java命名约定b)完全(一致地!)格式化代码(有一个“帮助”按钮,单击该按钮时会显示操作方法:-)如果你真的对质量感兴趣,没有任何方法可以阅读graphics2D选项、f.i.早期博客或FiltyRichClient的基础知识