gpt4 book ai didi

javafx - 去饱和效果冲走对比度

转载 作者:行者123 更新时间:2023-12-02 16:00:23 26 4
gpt4 key购买 nike

我对 javaFx 的 ColorAdjust 效果有一个非常具体的问题,我正在尝试在图像上应用灰度滤镜,我正在使用 ColorAdjust 效果并设置饱和度这是我正在尝试做的一个可重现的例子

public class App extends Application {
@Override
public void start(Stage ps) {
Pane root = new Pane();
root.setMinSize(300, 300);

root.setStyle("-fx-background-color: #40444b;");

ImageView view = new ImageView(new Image("https://res.cloudinary.com/mesa-clone/image/upload/v1642936429/1f914_tydc44.png"));
view.setTranslateX(5);
view.setTranslateY(5);
view.setEffect(new ColorAdjust(0, -1, 0, 0));

root.getChildren().add(view);

ps.setScene(new Scene(root));

ps.show();
}
}

现在这段代码完全按照它应该做的去做,但我对结果不满意,我想要一个灰度过滤器,它的行为类似于 web css 灰度过滤器,它为我的用例产生更好的结果:

<html>

<body style="background-color: #40444b;">
<img src="https://res.cloudinary.com/mesa-clone/image/upload/v1642936429/1f914_tydc44.png" style="filter: grayscale(100);">
</body>

</html>

javafx grayscale web grayscale

[ 左边是 javafx,右边是 Web (firefox) ]

我知道区别不大,但它对我的用例至关重要,如果有人有更好的想法来获得与灰度过滤器的 Web 版本类似的结果,我将不胜感激

最佳答案

IMO,您随 PixelWriter 解决方案提供的更新可能是您能做的最好的,您应该编辑问题以删除更新并将更新作为答案。

我意识到更新过程比使用 ColorAdjust 效果稍微复杂一些。

但我不认为你可以使用 ColorAdjust 做你想做的事。

灰度函数通过RGB multiplication调整颜色:

double gray = 0.21 * red + 0.71 * green + 0.07 * blue; 
return Color.color(gray, gray, gray, opacity);

ColorAdjust 通过 HSB 进行调整。

我可能是错的,但我认为您不能向 ColorAdjust 提供 HSB 参数来执行等效的 RGB 乘法。

潜在的更高性能解决方案

只有在遇到性能问题并且必须有更好的性能时才花时间在这上面。

您可以使用使用硬件加速的效果管道创建您自己的 GrayscaleEffect,如果您需要高性能,这可能是值得考虑的事情。但是这个过程真的很复杂,创建硬件加速效果并不容易,没有相关文档,为此您需要研究 openjfx 存储库中现有的效果代码并根据您的目的进行调整。

如果硬件加速实现太棘手,你可以使用fork join pool并行调整来加速,直接在字节缓冲区上操作而不是使用颜色对象。您需要为每个像素应用的算法由灰度函数实现给出。答案中有部分示例:

  • javafx argb to grayscale conversion

    int pixel = pixelReader.getArgb(x, y);

    int alpha = ((pixel >> 24) & 0xff);
    int red = ((pixel >> 16) & 0xff);
    int green = ((pixel >> 8) & 0xff);
    int blue = (pixel & 0xff);

    int grayLevel = (int) (0.2162 * red + 0.7152 * green + 0.0722 * blue);
    int gray = (alpha << 24) + (grayLevel << 16) + (grayLevel << 8) + grayLevel;

    grayImage.getPixelWriter().setArgb(x, y, gray);

但这不使用字节缓冲区,直接在像素读取器/写入器的字节缓冲区上工作可能更有效,尽管这有点棘手。

关于javafx - 去饱和效果冲走对比度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70821638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com