我制作了一个屏幕快照,然后尝试获取图像的一部分,当我尝试将其保存到文件时它不起作用。 很乐意得到任何建议
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);
}
答案 0 :(得分:2)
我的猜测是,您无法将从Raster
方法检索到的.getData()
投射到图像中。虽然技术上可以采用光栅,将其转换为WritableRaster
并将其包装在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的方法,所以我用方法替换了上面的代码。感谢Andrew Thompson。
答案 1 :(得分: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);
}
}