如何将Raster转换为RenderedImage

时间:2013-04-18 22:53:21

标签: java image raster

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

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

2 个答案:

答案 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);
    }
}