繁体   English   中英

如何制作高质量的截图?

[英]How to make a high quality screenshot?

我使用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"));
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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM