java pixel data_java - JavaFX PixelWriter性能低下

我创建了一个简单的JavaFX图像编辑器。有两个ImageView实例(对于原始图像,打开一个,对于已编辑图像,打开一个)。

一种方法将WritableImage转换为灰度。

问题是,转换所需的时间大约是Swing执行相同任务所需时间的两倍。知道为什么吗?@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");

}

秋千代码:

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倍左右。与AWT Color类相比,JavaFX Color类的实现要丰富得多。我想这要付出额外的开销。int width = (int)image.getWidth();

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

int[] pixels = new int[width * height];

WritablePixelFormat 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);

### 回答1: 您可以使用Java Swing提供的JOptionPane类来创建一个简单的对话框。 例如,以下代码将创建一个带有“确定”按钮的简单消息对话框: ``` JOptionPane.showMessageDialog(null, "Hello, World!"); ``` 如果您想要创建一个带有“确定”和“取消”按钮的确认对话框,您可以使用以下代码: ``` int choice = JOptionPane.showConfirmDialog(null, "Are you sure?"); if (choice == JOptionPane.YES_OPTION) { System.out.println("User clicked YES."); } else if (choice == JOptionPane.NO_OPTION) { System.out.println("User clicked NO."); } else { System.out.println("User clicked CANCEL."); } ``` 如果您需要从用户那里获取输入,可以使用以下代码创建带有文本框的输入对话框: ``` String input = JOptionPane.showInputDialog(null, "What is your name?"); System.out.println("User entered: " + input); ``` 希望这些代码可以帮助您创建自己的Java对话框。 ### 回答2: 在Java中,可以使用JOptionPane类的showInputDialog方法弹出一个输入框对话框。showInputDialog方法可以接收三个参数,分别是对话框的父组件、对话框的提示信息和对话框的标题。该方法返回用户在输入框中输入的字符串。 要使用该方法,首先需要导入JOptionPane类所在的包,即javax.swing包。然后可以通过如下代码创建一个输入框对话框: ```java import javax.swing.JOptionPane; public class InputDialogExample { public static void main(String[] args) { // 创建输入框对话框,父组件为null,提示信息为"请输入姓名:",标题为"输入姓名" String name = JOptionPane.showInputDialog(null, "请输入姓名:", "输入姓名", JOptionPane.PLAIN_MESSAGE); // 判断是否输入了姓名 if (name != null && !name.isEmpty()) { // 打印输入的姓名 System.out.println("您输入的姓名是:" + name); } else { // 如果没有输入姓名,打印提示信息 System.out.println("您没有输入姓名!"); } } } ``` 上述代码中,先创建了一个输入框对话框,父组件为null表示该对话框没有父组件,提示信息为"请输入姓名:",标题为"输入姓名",并指定了对话框的类型为JOptionPane.PLAIN_MESSAGE(即普通对话框)。然后通过判断用户是否输入了姓名,对输入的结果进行处理。 通过使用JOptionPane类的showInputDialog方法,可以方便地实现Java中的输入框功能,方便用户输入信息。在实际应用中,可以根据需要设置弹出对话框的父组件、提示信息和标题。 ### 回答3: 在Java中,我们可以使用Swing或JavaFX库来创建和管理图形用户界面(GUI)。为了弹出输入框或对话框,我们可以使用这些库中提供的特定类和方法。 首先,让我们看看如何使用Swing来实现弹出输入框。我们可以使用JOptionPane类中的showInputDialog()方法。该方法可弹出一个对话框,要求用户输入数据。以下是使用该方法的示例代码: ```java import javax.swing.JOptionPane; public class InputDialogExample { public static void main(String[] args) { String input = JOptionPane.showInputDialog("请输入您的姓名:"); System.out.println("您输入的姓名是:" + input); } } ``` 上述代码将弹出一个对话框,要求用户输入姓名,并将用户输入的姓名打印在控制台上。 另外,如果想要创建一个更自定义的输入对话框,我们可以使用JDialog类。通过创建一个自定义的JDialog对象,我们可以在其中添加各种组件和事件监听器,以满足我们的需求。 对于JavaFX,我们可以使用TextInputDialog类来实现类似的功能。以下是一个使用JavaFX的示例代码: ```java import javafx.application.Application; import javafx.scene.control.TextInputDialog; import javafx.stage.Stage; public class InputDialogExample extends Application { @Override public void start(Stage primaryStage) { TextInputDialog dialog = new TextInputDialog(); dialog.setTitle("输入框示例"); dialog.setHeaderText("请输入您的姓名:"); dialog.showAndWait().ifPresent(input -> System.out.println("您输入的姓名是:" + input)); } public static void main(String[] args) { launch(args); } } ``` 上述代码创建了一个JavaFX应用程序,弹出一个输入对话框要求用户输入姓名,并将用户输入的姓名打印在控制台上。 总之,Java中有多种方法可以弹出输入框或对话框。根据你的需求和使用的GUI库,你可以选择适合的方法来实现所需的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值