【问题标题】:Terrible Screenshot JavaFx可怕的截图 JavaFx
【发布时间】:2013-08-10 13:39:54
【问题描述】:

我正在尝试捕获当前场景的屏幕截图并将其另存为 png/jpg 和 pdf。保存屏幕截图时,这两个选项都成功,但是图像显示不正确。如图所示,屏幕截图非常糟糕,我似乎无法让它工作。出于某种原因保存时,图像也很可爱。

public void sceneCapture() throws IOException, InterruptedException, Exception
{ 
    File fa = new File("test.jpg");
    snapshot = quotes.getScene().snapshot(null);
    RenderedImage renderedImage = SwingFXUtils.fromFXImage(snapshot, null);
    BufferedImage image = new BufferedImage(600, 750, BufferedImage.TYPE_INT_RGB); 
    image.setData(renderedImage.getData());
    ImageIO.write(image, "jpg", fa);


     int[] RGB_MASKS = {0xFF0000, 0xFF00, 0xFF};
     ColorModel RGB_OPAQUE = new DirectColorModel(32, RGB_MASKS[0], RGB_MASKS[1], RGB_MASKS[2]);

    java.awt.Image img = Toolkit.getDefaultToolkit().createImage("test.jpg");
    PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, true);
    pg.grabPixels();
    int width = pg.getWidth(), height = pg.getHeight();

    DataBuffer buffer = new DataBufferInt((int[]) pg.getPixels(), pg.getWidth() * pg.getHeight());
    WritableRaster raster = Raster.createPackedRaster(buffer, width, height, width, RGB_MASKS, null);
    BufferedImage bi = new BufferedImage(RGB_OPAQUE, raster, false, null);

    String to = "test.jpg";
    ImageIO.write(bi, "jpg", new File(to));
 }

真的需要帮助解决这个问题。 谢谢

当前状态:

期望状态:

【问题讨论】:

  • 您能否附上您认为快照的外观和实际外观的图片?
  • 缓冲图像文档中提到的方法setData -“将图像的矩形区域设置为指定光栅 r 的内容,假定与 BufferedImage 位于相同的坐标空间中。”尺寸可能不同吗? SwingFXUtils.fromFXImage 返回一个缓冲图像,因此跳过它后面的 2 行并直接写入输出该图像,看看它如何改变输出。 docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/…

标签: image javafx-2 screenshot


【解决方案1】:

当我使用 ImageIO 将图像转换为 PNG 时效果很好

下面是我的实现代码

        try {
            SnapshotParameters param = new SnapshotParameters();
            param.setDepthBuffer(true);
            param.setFill(Color.CORNSILK);
            WritableImage snapshot = node.snapshot(param, null);
            BufferedImage tempImg = SwingFXUtils.fromFXImage(snapshot, null);

            File outputfile = new File("e:/tempImg.png");

            ImageIO.write(tempImg, "png", outputfile);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

【讨论】:

    【解决方案2】:

    Jpeg 图像有损并且可以具有可变的压缩级别,因此您可能需要调整压缩。 (PNG 图像是无损的,所以如果您将文件类型更改为 PNG 并且图像以所需的质量保存,这将证实我的怀疑)。

    要调整 Jpeg 编码器的压缩级别,您应该能够按照本指南进行操作; http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java

    根据指南,我希望您只需调用此代码即可;

    ImageWriter writer = (ImageWriter)ImageIO.getImageWritersByFormatName("jpeg").next();
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    iwp.setCompressionQuality(1);   // a float between 0 and 1
    // 1 specifies minimum compression and maximum quality
    FileImageOutputStream output = new FileImageOutputStream(fa);
    writer.setOutput(output);
    IIOImage iioimage = new IIOImage(image, null, null);
    writer.write(null, iioimage, iwp);
    writer.dispose();
    

    代替;

    ImageIO.write(image, "jpg", fa);
    

    【讨论】:

    • 我已经应用了您提供的步骤以及链接和图像仍然看起来不太好。我不确定这是否是压缩质量,因为它不起作用并且将图像保存为 PNG 格式也不能解决这种情况。
    • 嗯,也许您可​​以将要保存到 JPanel 的 BufferedImage 绘制出来,这将缩小质量损失是在写入之前还是在写入期间发生的。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 2019-01-30
    • 1970-01-01
    • 2011-05-04
    • 2013-02-23
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多