【问题标题】:How to make a high quality screenshot?如何制作高质量的截图?
【发布时间】:2019-12-13 14:50:54
【问题描述】:

我使用BufferedImage 截取屏幕截图,但是当我得到的图片显示质量很差。

这是我的代码:

Rectangle screenShot=new Rectangle(graphPanel.getX()+this.getX()+5,  
              graphPanel.getY()+this.getY()+navPanel.getHeight()+4, 
              graphPanel.getWidth(), graphPanel.getHeight());
BufferedImage capture=new Robot().createScreenCapture(screenShot);
ImageIO.write(capture, "jpg",new File("./PDFs/test"+"Graph"+".png"));

【问题讨论】:

标签: java image swing awt awtrobot


【解决方案1】:
ImageIO.write(capture, "jpg",new File("./PDFs/test"+"Graph"+".png"));

应该是:

ImageIO.write(capture, "png",new File("./PDFs/test"+"Graph"+".png")); 

在文件扩展名中将图像称为 PNG 不会使其成为 PNG。它还需要编码为 PNG。

[我]做了[更改]它,但没有结果

这段代码你得到了什么输出?我得到了:

type: jpg  Color difference: 926283 or 0.7852198282877604%.
type: png  Color difference: 0 or 0.0%.

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.imageio.ImageIO;
import java.io.*;
import java.net.*;

public class ImageSave {

    private JComponent ui = null;
    public final static String[] types = {"jpg","png"};
    private final JComboBox<String> typesBox = new JComboBox<>(types);
    BufferedImage image;
    BufferedImage imageCoded;
    JLabel imageLabel = new JLabel();
    JLabel imageCodedLabel = new JLabel();
    JLabel output = new JLabel("Output appears here..");

    ImageSave() {
        try {
            initUI();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public final void initUI() throws Exception {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        URL url = new URL("https://i.stack.imgur.com/7bI1Y.jpg");
        image = ImageIO.read(url);
        imageLabel.setIcon(new ImageIcon(image));

        JPanel picsPanel = new JPanel(new GridLayout(1, 0, 4, 4));
        ui.add(picsPanel);

        picsPanel.add(imageLabel);
        picsPanel.add(imageCodedLabel);

        JToolBar toolBar = new JToolBar();
        ui.add(toolBar, BorderLayout.PAGE_START);
        toolBar.setLayout(new FlowLayout(FlowLayout.LEADING));
        toolBar.add(typesBox);
        ActionListener refreshListener = (ActionEvent e) -> {
            try {
                updateGUI();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        };
        typesBox.addActionListener(refreshListener);

        toolBar.add(output);

        updateGUI();
    }

    private void updateGUI() throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        String type = typesBox.getSelectedItem().toString();
        ImageIO.write(image, type, baos);
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        imageCoded = ImageIO.read(bais);
        imageCodedLabel.setIcon(new ImageIcon(imageCoded));

        int diff = compareImages();
        int max = image.getWidth()*image.getHeight()*256*3;
        double percent = 100d*(double)diff/(double)max;
        String s = "type: " + type + "  Color difference: " + diff + 
                " or " + percent + "%.";
        System.out.println(s);
        output.setText(s);
    } 

    private int compareImages() {
        int diff = 0;
        for (int xx=0; xx<image.getWidth(); xx++) {
            for (int yy=0; yy<image.getHeight(); yy++) {
                Color rgb1 = new Color(image.getRGB(xx, yy));
                Color rgb2 = new Color(imageCoded.getRGB(xx, yy));
                int r1 = rgb1.getRed();
                int g1 = rgb1.getGreen();
                int b1 = rgb1.getBlue();
                int r2 = rgb2.getRed();
                int g2 = rgb2.getGreen();
                int b2 = rgb2.getBlue();
                diff += Math.abs(r1-r2);
                diff += Math.abs(g1-g2);
                diff += Math.abs(b1-b2);
            }
        }
        return diff;
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            ImageSave o = new ImageSave();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

  • 我确实改了,但没有结果
  • 我发布了minimal reproducible example 作为对答案的编辑。请告诉我们它在您的系统上报告的内容(复制/粘贴文本输出)。如果它报告的内容与上述大致相同,请对其进行更改以获取屏幕截图并再次检查输出。
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多