Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 提高javaFx处理性能_Image Processing_Javafx - Fatal编程技术网

Image processing 提高javaFx处理性能

Image processing 提高javaFx处理性能,image-processing,javafx,Image Processing,Javafx,我正在用javaFx进行图像处理。我认为我的代码对于高清图像来说效率不高,刷新速度很慢。因为每次我需要刷新图像时,我都会对图像的每个像素进行一次扫描。但我不知道如何做不同 因此,我需要帮助来提高我的处理性能 这是我的代码: import javafx.application.Application; import javafx.beans.InvalidationListener; import javafx.beans.Observable; import javafx.beans.prope

我正在用javaFx进行图像处理。我认为我的代码对于高清图像来说效率不高,刷新速度很慢。因为每次我需要刷新图像时,我都会对图像的每个像素进行一次扫描。但我不知道如何做不同

因此,我需要帮助来提高我的处理性能

这是我的代码:

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Example extends Application {

    private Image src;
    private WritableImage dest;
    private int width;
    private int height;
    int value = 0;

@Override
public void start(Stage stage) {
    AnchorPane root = new AnchorPane();
    initImage(root);
    Scene scene = new Scene(root);
    stage.setTitle("Demo processing");
    stage.setResizable(false);
    stage.setScene(scene);
    stage.show();
}

private void initImage(AnchorPane root) {
    src = new Image(
            "http://mikecann.co.uk/wp-content/uploads/2009/12/ScreenHunter_02-Dec.-10-19.41-1024x484.jpg");
    width = (int) src.getWidth();
    height = (int) src.getHeight();
    root.setPrefSize(800, 800 + 50);
    ScrollPane scrollPane = new ScrollPane();
    scrollPane.setPrefHeight(600);
    scrollPane.setPrefWidth(1000);
    dest = new WritableImage(width, height);
    ImageView destView = new ImageView(dest);

    scrollPane.setContent(destView);

    root.getChildren().add(scrollPane);
    AnchorPane.setTopAnchor(scrollPane, 0.0);

    Slider slider = new Slider(0, 255, 1);
    slider.setPrefSize(800, 50);
    slider.setShowTickLabels(true);
    slider.setShowTickMarks(true);
    slider.setSnapToTicks(true);
    slider.setMajorTickUnit(1.0);
    slider.setMinorTickCount(0);
    slider.setLayoutY(700);
    slider.valueProperty().addListener(new InvalidationListener() {
        @Override
        public void invalidated(Observable o) {
            value = (int) ((DoubleProperty) o).get();
            color();
        }
    });
    root.getChildren().add(slider);
    color();
}

private void color() {
    PixelReader reader = src.getPixelReader();
    PixelWriter writer = dest.getPixelWriter();
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            Color color = reader.getColor(x, y);
            double red = (double) value * x * y / (width * height) / 255;
            double green = color.getGreen();
            double blue = (double) value * ((width * height) - x * y)
                    / (width * height) / 255;
                writer.setColor(x, y, Color.color(red, green, blue));
            }
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

获取循环中每个像素的颜色太慢。所以,首先获取整个像素,然后更改颜色,最后使用PixelWriter更改颜色。 像这样

private void color() {
    PixelReader reader = src.getPixelReader();
    WritablePixelFormat<IntBuffer> format = WritablePixelFormat.getIntArgbInstance();
    int[] pixels = new int[width * height]; // Buffer for all pixels
    reader.getPixels(0, 0, width, height, format, pixels, 0, width); // get all pixels by argb format
    int alpha = 0xFF << 24;
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int index = x + y * width;
            int argb = pixels[index];
            int red = value * x * y / (width * height);
            int green = (argb >> 8) & 0xFF;
            int blue = value * ((width * height) - x * y)
                    / (width * height);
            int newArgb = alpha | (red << 16) | (green << 8) | blue;
            pixels[index] = newArgb;
        }
    }
    PixelWriter writer = dest.getPixelWriter();
    writer.setPixels(0, 0, width, height, format, pixels, 0, width); // write entire image
}
private void color() {
    PixelReader reader = src.getPixelReader();
    WritablePixelFormat<IntBuffer> format = WritablePixelFormat.getIntArgbInstance();
    int[] pixels = new int[width * height]; // Buffer for all pixels
    reader.getPixels(0, 0, width, height, format, pixels, 0, width); // get all pixels by argb format
    int alpha = 0xFF << 24;
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            int index = x + y * width;
            int argb = pixels[index];
            int red = value * x * y / (width * height);
            int green = (argb >> 8) & 0xFF;
            int blue = value * ((width * height) - x * y)
                    / (width * height);
            int newArgb = alpha | (red << 16) | (green << 8) | blue;
            pixels[index] = newArgb;
        }
    }
    PixelWriter writer = dest.getPixelWriter();
    writer.setPixels(0, 0, width, height, format, pixels, 0, width); // write entire image
}