JavaFX PixelWriter性能低下 [英] JavaFX PixelWriter low performance

查看:489
本文介绍了JavaFX PixelWriter性能低下的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个简单的JavaFX图像编辑器。 ImageView有两个实例(原始图像打开,编辑打印一个)。
方法将WritableImage转换为灰度。
问题是,转换需要大约两倍于Swing执行相同任务所需的时间。知道为什么吗?

I created a simple JavaFX image editor. There are two instances of ImageView (on for the original image and one for the edited one). A method converts the WritableImage to grayscale. The problem is, the conversion takes approximately twice the time Swing needs to do the same task. Any idea why?

@FXML
void loadImage(ActionEvent event) {
    FileChooser fileChooser = new FileChooser();
    File file = fileChooser.showOpenDialog(Main.primaryStage);
    if (file != null) {
        Image image = new Image("file:" + file.getAbsolutePath());
        imViewOrig.setImage(image);
        PixelReader pr = imViewOrig.getImage().getPixelReader();
        WritableImage wi = new WritableImage(
            pr, 
            (int)imViewOrig.getImage().getWidth(), 
            (int)imViewOrig.getImage().getHeight());
        imViewEdit.setImage(wi);
    }
}

@FXML
void greyscale(ActionEvent event) {
    PixelReader pr = imViewOrig.getImage().getPixelReader();
    PixelWriter pw = ((WritableImage)imViewEdit.getImage()).getPixelWriter();
    long beginTime = System.currentTimeMillis();
    for (int x = 0; x < imViewEdit.getImage().getWidth(); x++) {
        for (int y = 0; y < imViewEdit.getImage().getHeight(); y++) {
            Color c = pr.getColor(x, y);
            double avg = (c.getRed() + c.getGreen() + c.getBlue()) / 3.;
            Color grey = new Color(avg, avg, avg, c.getOpacity());
            pw.setColor(x, y, grey);                
        }
    }
    System.out.println(System.currentTimeMillis() - beginTime + "ms");
}

Swing代码:

public void greyscale() {
    long beginTime = System.currentTimeMillis();
    for (int x = 0; x < image.getWidth(); x++) {
        for (int y = 0; y < image.getHeight(); y++) {
            Color c = new Color(image.getRGB(x, y));
            int avg = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
            Color grey = new Color(avg, avg, avg);
            image.setRGB(x, y, grey.getRGB());                
        }
    }
    repaint();
    System.out.println(System.currentTimeMillis() - beginTime + "ms");
}


推荐答案

在快速测试中,它如果只执行 int 计算,而不是操作 Color 对象,则工作速度提高10倍。 JavaFX Color 类比AWT Color 类更丰富。我想这需要额外的开销。

In a quick test, it works of the order of 10 times faster if you just do the int computations, instead of manipulating Color objects. The JavaFX Color class is a substantially richer implementation than the AWT Color class; I guess this comes at a cost of additional overhead.

    int width = (int)image.getWidth();
    int height = (int)image.getHeight();

    int[] pixels = new int[width * height];
    WritablePixelFormat<IntBuffer> pixelFormat = PixelFormat.getIntArgbPreInstance();
    pr.getPixels(0, 0, width, height, pixelFormat, pixels, 0, width);

    int[] newPixels = new int[pixels.length];
    for (int i = 0 ; i < pixels.length; i++) {
        int c = pixels[i];
        int a = c & 0xFF000000 ;
        int r = (c >> 16) & 0xFF ;
        int g = (c >> 8) & 0xFF ;
        int b = c & 0xFF ;
        int gray = (r+g+b) / 3 ;
        newPixels[i] = a | (gray << 16) | (gray << 8) | gray ;
    }

    pw.setPixels(0, 0, width, height, pixelFormat, newPixels, 0, width);

这篇关于JavaFX PixelWriter性能低下的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆