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

2024-02-24

我正在开发一个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");
    }
    }

也许我可以在保存时缩放图像..以便我可以检索缩放后的图像..


当然,您可以通过多种不同的方式调整图像大小,例如Image#getScaledInstance(int width,int height,int hints) http://docs.oracle.com/javase/7/docs/api/java/awt/Image.html#getScaledInstance%28int,%20int,%20int%29, but 这有其危险 http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html.

主要问题是:

Image.getScaledInstance() 不会返回完成的缩放图像。它 当图像像素变大时,将大部分缩放工作留到以后进行 被使用。

我不建议使用它但是here http://www.java2s.com/Code/JavaAPI/java.awt/ImagegetScaledInstanceintwidthintheightinthints.htm是一个很好的例子。

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

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

UPDATE:

这是我做的一个小例子:

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

参考:

  • java getScaledInstance 调整图像大小 https://stackoverflow.com/questions/7252983/resizing-image-java-getscaledinstance
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JPanel 或 JLabel 中调整图像大小并显示,而不会损失质量 的相关文章

随机推荐

  • 使用 JPA Criteria API,您可以执行仅产生一个连接的获取连接吗?

    使用 JPA 2 0 似乎默认情况下 没有显式获取 OneToOne fetch FetchType EAGER 字段在 1 N 次查询中获取 其中 N 是包含定义与不同相关实体的关系的实体的结果数 使用 Criteria API 我可能会
  • Openpyxl - 对象没有属性“load_workbook”

    我正在尝试使用 openpyxl 加载现有工作簿 但当我试图奔跑时这段代码 http packages python org openpyxl usage html read an existing workbook 我收到以下错误 Att
  • ASP.NET Core 3.1 无法取消保护消息。状态在调试器中运行

    我已使用默认模板从 VS 2022 创建了 ASP NET Core 3 1 Web 应用程序 并选择 Microsoft Identity 来使用 Azure AD 身份验证 向导在我的 Azure AD 租户中生成了应用程序注册 一切看
  • 是否可以创建一个剪切的div?

    是否可以创建一个剪切 倾斜的标题 div 如下图所示 它适用于移动网站 是的 这是可能的 DEMO http jsfiddle net jbutler483 2qmmpmb9 2 wrapper overflow hidden height
  • 媒体查询/根据屏幕尺寸加载不同的图像

    这可能是基本的 但我迷失在我在网上找到的所有解决方案中 我有一个基于 Twitter Bootstrap 3 的正在运行的网站 www webstalab com 但使用的图像 描绘了两个拿着球的雕像 相当大 大约 900kb 因此在较慢的
  • 将 War 部署到 Mule 独立服务器中

    我有一个 mule 独立服务器 其中包含我正在开发的应用程序 该应用程序使用的许多服务将来将从 Mule 容器移至 JBoss 集群中 因此 我在 Mule 流和 Web 服务之间保持了严格的分离 然而 截至目前 我需要将 War 文件部署
  • 如何在 Maven 中包含/引用 jackson-all.jar

    我无法找到 jackson all jar 的存储库条目 不知道为什么我可以看到单独的杰克逊罐子信息 所以 如何引用 jackson all jar 对于 杰克逊 2 请查看com fasterxml jackson http search
  • awk 中的字符串比较

    我需要按字母顺序比较两个字符串 而不仅仅是相等测试 我想知道有没有办法在 awk 中进行字符串比较 当然可以 pax echo hello goodbye gawk if 0 hello print HELLO HELLO 你也可以做不等式
  • 将内部 div 不透明度设置为 1,但不生效

    我有一个带有背景图像和背景颜色的 div 我把这个div的不透明度设置为0 7 之后 我在这个 div 内部创建了一个内部 div 但我不想给这个 div 带来不透明度 这是我的CSS代码 outer position relative b
  • System.Windows.Forms.SaveFileDialog 不强制执行默认扩展名

    我正在努力使SaveFileDialog and FileOpenDialog对用户输入的文件名强制执行扩展名 我尝试过使用中提出的示例问题 389070 https stackoverflow com questions 389070 h
  • 为网站实现字体?

    我在 CSS 中使用字体 AR CENA 但在浏览网站时它没有加载字体 对我来说它运行良好 但我认为因为我已经安装了字体 所以它从我的电脑加载它 有没有办法实现这种字体并正常出现在网站上供用户使用 u2966 5 z index 500 w
  • 如何从 python 中激活 pyvenv virtualenv? (activate_this.py 被删除了?)

    我正在使用 Python 3 4 并创建了 pyvenv 我希望从 python 进程中激活它 对于 virtualenv 我曾经使用过activate this py 但这似乎在 pyvenv 中消失了 现在有没有一种简单的方法可以有效地
  • 为什么我不能将 Promise.resolve 与 osmosis 实例一起使用?

    我试图理解为什么这些console log语句的行为不同 我希望他们的行为是一样的 使用 Node 7 考虑以下情况 1 Promise resolve 对象 Promise resolve按照我的预期处理对象 Promise resolv
  • 如何使用pandas加速数据加载?

    我正在使用 pandas 和 Jupiter 笔记本 我正在读取 700MB 的 CSV 文件 加载需要 69 秒 出于测试目的 这是可以接受的 因为我只需要加载它一次 并且它在笔记本实例的持续时间内保留在内存中 pd read csv p
  • 找到第三点

    我有2分P1 and P2 我需要找到P3 为了使 所有点都在同一条线上 P3应该在距离d来自P2 远离P1 I started a complicated system apparently hardly to resolve PS 矢量
  • “克隆”索引映射

    我有一个索引 我将重新索引它 目前我想创建一个新索引 它应该包含与原始索引中完全相同的映射 我有这个 var srcMappings client GetMapping new GetMappingRequest Indices sourc
  • 找出所有可能的组合

    我之前问过这个问题 但涉及另一种编程语言 假设我有几个词根 前缀和后缀 roots car insurance auto insurance prefix cheap budget suffix quote quotes Python 中是
  • WPF 打印多页预览

    我对这个主题了解得越多 我理解的就越少 所以如果下面的内容看起来完全不合时宜 请提前道歉 我有一个包含流程文档的用户控件 具有相应视图模型的视图 目的是将其发送到预览窗口 用户可以在其中查看文档并打印它 我从以下示例中提取了一些代码http
  • 如何在用户行走时跟踪 GPS 坐标,来自 iOS 平台的 xamarin.forms

    我刚刚经历过这个link http developer xamarin com recipes ios multitasking track significant location change 当用户使用 xamarin forms 应
  • 在 JPanel 或 JLabel 中调整图像大小并显示,而不会损失质量

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