JavaFX-相互绘制多边形时获得像素颜色

时间:2018-12-08 12:34:05

标签: java javafx

我正在从事一个旨在仅使用固定数量的凸包/多边形来复制图像的项目。

我正在使用JavaFX来提供漂亮的GUI。

解决这个问题的方法是在画布上绘制多边形列表,让我们获得图像。

为了评估解决方案的质量,我要拍摄要复制的图像以及从多边形列表中获取的图像,然后计算每个像素颜色之间的距离。

如果每个像素的颜色之间的距离为零,则可以说我复制了目标图像。

我对此功能的实现速度很慢。

总而言之,我为每个像素搜索包含它的多边形是什么,然后以正确的顺序添加颜色(我使用的是透明颜色,因此顺序很重要)。 我计算出该颜色与我尝试达到的颜色之间的距离(在目标图像上)。 我总结了这些距离,就是这样!

private void computeEval() {
    PixelReader pixelReaderSolution = image.getPixelReader();
    AtomicReference<Double> eval2 = new AtomicReference<>((double) 0);
    Lock lock = new ReentrantLock();

    IntStream.range(0, (int) image.getWidth()).parallel()
            .forEach(x -> IntStream.range(0, (int) image.getHeight()).parallel()
                    .forEach(y -> {
                        Color colorSolution = pixelReaderSolution.getColor(x, y);
                        Point2D pixel = new Point2D(x, y);
                        AtomicReference<Color> pixelColor = new AtomicReference<>();
                        pixelColor.set(null);

                        polygons.stream()
                                .filter(convexPolygon -> convexPolygon.getAsPolygon().contains(pixel))
                                .forEach(convexPolygon -> {
                                    if (pixelColor.get() == null) {
                                        pixelColor.set(convexPolygon.color);
                                    } else {
                                        pixelColor.set(addColor(pixelColor.get(), convexPolygon.color));
                                    }
                                });
                        if (pixelColor.get() == null) {
                            pixelColor.set(Color.WHITE);
                        }
                        lock.lock();
                        eval2.updateAndGet(v -> v + distanceColor(colorSolution, pixelColor.get()));
                        lock.unlock();
                    }));
    evaluation = 1 - (eval2.get() / (3 * image.getWidth() * image.getHeight()));
}

过去,我使用的函数snapshot很快,但是却迫使我在JavaFX线程中计算评估值。因此,通过在GUI线程中进行大量计算来阻塞我的整个GUI。

当前的解决方案使我可以将计算放在Service内,但这确实很慢。

我对此有些困惑,我想知道是否有人对我有想法...

我也可能以错误的方式使用JavaFX。

如果人们想知道周围有什么不同的功能,我可以给出更多的代码,但我100%认为是该功能使所有功能变慢。

0 个答案:

没有答案