如何克隆javafx.scene.image.image?

如何克隆javafx.scene.image.image?,javafx,Javafx,是否可以克隆javafx.scene.image.image,而不使用逐像素复制? 还是唯一的办法?这是解决方案: writableImage = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(sourceImage, null), null) 完整代码: public class JavaFXApplication extends Application { @Override public void start(Stage primary

是否可以克隆
javafx.scene.image.image
,而不使用逐像素复制? 还是唯一的办法?

这是解决方案:

writableImage = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(sourceImage, null), null)
完整代码:

public class JavaFXApplication extends Application {

@Override
public void start(Stage primaryStage) {

    Image sourceImage = new Image("http://goo.gl/kYEQl");
    ImageView imageView = new ImageView();
    imageView.setImage(sourceImage);
    ImageView destImageView = new ImageView();

    //copying sourceImage
    destImageView.setImage(SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(sourceImage, null), null));

    VBox vBox = new VBox();
    vBox.getChildren().addAll(imageView, destImageView);
    StackPane root = new StackPane();
    root.getChildren().add(vBox);
    Scene scene = new Scene(root, 300, 300);
    primaryStage.setTitle("java-buddy.blogspot.com");
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}
}这就是解决方案:

writableImage = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(sourceImage, null), null)
完整代码:

public class JavaFXApplication extends Application {

@Override
public void start(Stage primaryStage) {

    Image sourceImage = new Image("http://goo.gl/kYEQl");
    ImageView imageView = new ImageView();
    imageView.setImage(sourceImage);
    ImageView destImageView = new ImageView();

    //copying sourceImage
    destImageView.setImage(SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(sourceImage, null), null));

    VBox vBox = new VBox();
    vBox.getChildren().addAll(imageView, destImageView);
    StackPane root = new StackPane();
    root.getChildren().add(vBox);
    Scene scene = new Scene(root, 300, 300);
    primaryStage.setTitle("java-buddy.blogspot.com");
    primaryStage.setScene(scene);
    primaryStage.show();
}

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

}

迟交的答案,你可能到目前为止都答对了

我对这个问题的解决办法是这样的

// First create a cache image
planTiles[1][1] = new PlanTile(1, 1, "");
ImageView cache = planTiles[1][1].renderImage();  // timeconsuming operation

// In loop, use cache: 
planTiles[iX][iY] = new PlanTile(iX, iY, "");
planTiles[iX][iY].setImage(cache.getImage());

迟来的回答,你可能已经做到了

我对这个问题的解决办法是这样的

// First create a cache image
planTiles[1][1] = new PlanTile(1, 1, "");
ImageView cache = planTiles[1][1].renderImage();  // timeconsuming operation

// In loop, use cache: 
planTiles[iX][iY] = new PlanTile(iX, iY, "");
planTiles[iX][iY].setImage(cache.getImage());

下面的代码从您的链接复制并放入一个单独的函数中,这肯定不是问题的“唯一”解决方案。这绝对是我个人所知道的最好的工作。下面是剪切和粘贴的代码:

copyImage

   /**
     * copy the given image to a writeable image
     * @param image
     * @return a writeable image
     */
    public static WritableImage copyImage(Image image) {
      int height=(int)image.getHeight();
      int width=(int)image.getWidth();
      PixelReader pixelReader=image.getPixelReader();
      WritableImage writableImage = new WritableImage(width,height);
      PixelWriter pixelWriter = writableImage.getPixelWriter();

      for (int y = 0; y < height; y++){
          for (int x = 0; x < width; x++){
              Color color = pixelReader.getColor(x, y);
              pixelWriter.setColor(x, y, color);
          }
      }
      return writableImage;
    }

下面的代码从您的链接复制并放入一个单独的函数中,这肯定不是问题的“唯一”解决方案。这绝对是我个人所知道的最好的工作。下面是剪切和粘贴的代码:

copyImage

   /**
     * copy the given image to a writeable image
     * @param image
     * @return a writeable image
     */
    public static WritableImage copyImage(Image image) {
      int height=(int)image.getHeight();
      int width=(int)image.getWidth();
      PixelReader pixelReader=image.getPixelReader();
      WritableImage writableImage = new WritableImage(width,height);
      PixelWriter pixelWriter = writableImage.getPixelWriter();

      for (int y = 0; y < height; y++){
          for (int x = 0; x < width; x++){
              Color color = pixelReader.getColor(x, y);
              pixelWriter.setColor(x, y, color);
          }
      }
      return writableImage;
    }

你想做什么?是否真的要克隆图像或在场景中多次使用同一图像?因为在这种情况下,只需将图像添加到您创建的ImageView中。我需要精确克隆图像。您想做什么?是否真的要克隆图像或在场景中多次使用同一图像?因为在这种情况下,只需将图像添加到您创建的ImageView中。我需要准确地克隆图像。这些只是帮助器方法。您还可以从提供的链接中的代码创建一个helper方法。此外,SwingFXUtils使用awt,因此如果您喜欢使用纯JavaFX,这实际上不是一个好的解决方案。为什么您不能使用
destImageView.setImage(sourceImage)
?因为我需要另一个对象,先生。我承认,SwingFXUtils并不是一个好的解决方案,但是Oracle并没有提供任何合适的方法来克隆至少JavaFx图像。如果我想写短代码,我必须使用一种丑陋的方式使用SwingFXUtils,否则我将被迫自己实现不存在的javafx.superCloneUtil.cloneImage(图像图像)方法,这肯定是存在的。然后从图像扩展,实现可克隆接口,并从您提供的链接添加9行代码。或者使用公共静态映像克隆(Image sourceImage){…9行代码…}方法创建ImageUtils类。如果您克隆了它们,并且不能重复使用这些图像,那么您肯定有更多的图像处理代码需要实现。这些只是辅助方法。您还可以从提供的链接中的代码创建一个helper方法。此外,SwingFXUtils使用awt,因此如果您喜欢使用纯JavaFX,这实际上不是一个好的解决方案。为什么您不能使用
destImageView.setImage(sourceImage)
?因为我需要另一个对象,先生。我承认,SwingFXUtils并不是一个好的解决方案,但是Oracle并没有提供任何合适的方法来克隆至少JavaFx图像。如果我想写短代码,我必须使用一种丑陋的方式使用SwingFXUtils,否则我将被迫自己实现不存在的javafx.superCloneUtil.cloneImage(图像图像)方法,这肯定是存在的。然后从图像扩展,实现可克隆接口,并从您提供的链接添加9行代码。或者使用公共静态映像克隆(Image sourceImage){…9行代码…}方法创建ImageUtils类。如果您克隆了它们并且不能重复使用这些图像,那么无论如何您肯定要实现更多的图像处理代码。