1

我制作了屏幕快照并尝试获取图像的一部分,当我尝试将其保存到文件时它不起作用。很乐意得到任何建议

Rectangle Rect = new Rectangle(10, 10, 50, 50);
File file = new File("D:\\output.png");
RenderedImage renderedImage = SwingFXUtils.fromFXImage(browser.snapshot(null, null), null);
try {
    ImageIO.write((RenderedImage) renderedImage.getData(Rect),"png",file);
                 } catch (IOException ex { Logger.getLogger(JavaFXApplication3.class.getName()).log(Level.SEVERE, null, ex);
                 }

所以在这里我终于得到了它并且它有效

                     File file = new File("D:\\output.png");
                 BufferedImage image = SwingFXUtils.fromFXImage(browser.snapshot(null,   null), null);
                 try {
                     ImageIO.write(image.getSubimage(100, 100, 50, 50) , "png", file);
                 } catch (IOException ex) {
                     Logger.getLogger(JavaFXApplication3.class.getName()).log(Level.SEVERE, null, ex);
                 }
4

2 回答 2

2

我的猜测是,您无法Raster将从方法中检索到的内容.getData()转换为图像。虽然在技术上应该可以获取光栅,将其转换为 aWritableRaster并将其包装在 a 中RenderedImage,但我建议您基本上复制图像的一部分。快速SSCE

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.*;
import java.io.File;

public class Test {

    public static void main(String[] args) throws Exception {
        BufferedImage original = new BufferedImage(100, 100, BufferedImage.TYPE_3BYTE_BGR);
        // Crop away 10 pixels pixels and only copy 40 * 40 (the width and height of the copy-image)
        BufferedImage copy     = original.getSubimage(10, 10, 50, 50);

        ImageIO.write(copy, "png", new File("Test.png"));
    }

}

这对我有用,所以如果您遇到更多麻烦,您可能会考虑确保正确获取输入。如果您的问题是程序“卡住”了,请先使用虚拟图像尝试上述代码。

希望有帮助:-)

编辑:我不知道有一个名为 getSubimage 的方法,所以我用该方法替换了上面的代码。感谢安德鲁·汤普森。

于 2013-04-18T23:25:34.073 回答
1

一旦应用程序。有一个参考BufferedImage,只需使用该subImage(Rectangle)方法创建较小的图像。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;

class ScreenSubImage {

    public static void main(String[] args) throws Exception {
        Robot robot = new Robot();
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        BufferedImage image = robot.createScreenCapture(new Rectangle(d));
        BufferedImage sub = image.getSubimage(0, 0, 400, 400);
        File f = new File("SubImage.png");
        ImageIO.write(sub, "png", f);
        final ImageIcon im = new ImageIcon(f.toURI().toURL());

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JOptionPane.showMessageDialog(null, new JLabel(im));
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
于 2013-04-19T02:55:19.910 回答