如何保存 JavaFX Canvas 的高 DPI 快照

问题描述 投票:0回答:2

我在画布上创建了一个图像,该图像通过转换按比例缩小以进行显示。它也在 ScrollPane 中,这意味着只有图像的一部分可见。

我需要拍摄整个画布的快照并将其保存为高分辨率图像。当我使用 Canvas.snapshot 时,我会在缩小后获得图像可见部分的可写图像。这会导致保存低分辨率的部分图像。

那么我该如何创建一个包含整个画布(不仅是滚动窗格的视口)并具有向下转换之前的分辨率的快照?

我目前没有做任何花哨的事情,只是这样:

public WritableImage getPackageCanvasSnapshot()
{
    SnapshotParameters param = new SnapshotParameters();
    param.setDepthBuffer(true);
    return packageCanvas.snapshot(param, null);
}
javafx javafx-8
2个回答
14
投票

我执行了以下操作,在 Retina 显示屏上获取像素比例因子为 2.0 的画布快照。这对我有用。

public static WritableImage pixelScaleAwareCanvasSnapshot(Canvas canvas, double pixelScale) {
    WritableImage writableImage = new WritableImage((int)Math.rint(pixelScale*canvas.getWidth()), (int)Math.rint(pixelScale*canvas.getHeight()));
    SnapshotParameters spa = new SnapshotParameters();
    spa.setTransform(Transform.scale(pixelScale, pixelScale));
    return canvas.snapshot(spa, writableImage);     
}

0
投票

您需要做的就是在参数中设置比例。

例如,要生成宽度为 1600 像素的快照,同时保持宽高比,请执行以下操作:

public WritableImage getPackageCanvasSnapshot()
{
    SnapshotParameters params = new SnapshotParameters();
    double s = 1600.0 / packageCanvas.getBoundsInLocal().getWidth();
    params.setTransform(new Scale(s, s));
    return packageCanvas.snapshot(params, null);
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.