2016-06-15 2 views
1

У меня нет опыта обработки изображений в java. Моя цель - объединить несколько изображений. Чтобы быть более подробным, у меня есть образ шаблона и некоторые другие изображения. Я хочу поместить эти изображения в образ шаблона в определенных местах. Для например:java, составить изображение из нескольких изображений

шаблон изображения:

enter image description here

конкретный образ:

enter image description here

Итак, я хочу поставить собаку изображение на изображения мест кошек и сохранить созданное изображение.

Пожалуйста, расскажите, что является самым простым способом для этого?

+0

не могли бы вы рассказать нам, где эти изображения? например из Интернета? из вашего локального каталога? –

+0

@YuZhang: изображения хранятся в моем локальном каталоге. –

+0

'Пожалуйста, расскажите, что это самый простой способ сделать это?' Пожалуйста, напишите, что вы пробовали – Frakcool

ответ

5

Как Fabian отметил, идентифицирующие модели могут не дать ожидаемых результатов, поэтому мое предложение было бы альтернативный

Если вы контролируете шаблоны и предоставлять их пользователю в качестве вариантов, вы могли бы реализовать их самостоятельно и заполнять изображения в узлах-заполнителях. Объединённая изображение придет принимать общий снимок

Я включил быстрый пример, но учтите, что это не в полном объеме (расположение и т.д.), поэтому рассматривать его скорее как доказательство концепции. По-прежнему можно строить на одном из них, чтобы одновременно отображать разные изображения, украшение текста, звезды и т. Д., Чтобы быть более подробным изображением приведенного вами изображения.

Это не может быть самый простой способ, но он может быть приятным опытом обучения. Это также может быть жизнеспособным вариантом, так как вы не имеете опыта обработки изображений в Java


public class ImageTemplateNode extends Region{ 
    private SimpleObjectProperty<Image> displayedImageProperty; 
    private ObservableList<Node> children = FXCollections.observableArrayList(); 
    private Random random = new Random(); 
    private int rows, columns; 
    private final int maximumRotation = 15; 

    public ImageTemplateNode(int rows, int cols, Image imageToDisplay){ 
     this.rows = rows; 
     this.columns = cols; 
     this.displayedImageProperty = new SimpleObjectProperty<>(imageToDisplay); 
     createDisplayNodes(); 
     setPadding(new Insets(10)); 
     Bindings.bindContentBidirectional(getChildren(), children); 
    } 

    public ImageTemplateNode(int rows, int cols, Image imageToDisplay, Image backgroundImage){ 
     this(rows, cols, imageToDisplay); 
     setBackgroundImage(backgroundImage); 
    } 

    private void createDisplayNodes(){ 
     for(int count = 0; count < (rows * columns); count++){ 
      StackPane container = new StackPane(); 
      container.setRotate(getRandomRotationValue()); 
      container.setBackground(
        new Background(new BackgroundFill(getRandomColour(), new CornerRadii(5), new Insets(5)))); 
      container.maxWidthProperty().bind(displayedImageProperty.get().widthProperty().add(25)); 
      container.maxHeightProperty().bind(displayedImageProperty.get().heightProperty().add(25)); 

      ImageView displayNode = new ImageView(); 
      displayNode.imageProperty().bind(displayedImageProperty); 
      displayNode.fitWidthProperty().bind(container.widthProperty().subtract(25)); 
      displayNode.fitHeightProperty().bind(container.heightProperty().subtract(25)); 

      container.getChildren().setAll(displayNode); 
      children.add(container); 
     } 
    } 

    private int getRandomRotationValue(){ 
     int randomValue = random.nextInt(maximumRotation); 
     //Rotate clockwise if even, anti-clockwise if odd 
     return randomValue % 2 == 0 ? randomValue : 360 - randomValue; 
    } 

    private Color getRandomColour(){ 
     int red = random.nextInt(256); 
     int green = random.nextInt(256); 
     int blue = random.nextInt(256); 
     return Color.rgb(red, green, blue); 
    } 

    @Override 
    protected void layoutChildren() { 
     //Calculate the dimensions for the children so that they do not breach the padding and allow for rotation 
     double cellWidth = (widthProperty().doubleValue() 
       - getPadding().getLeft() - getPadding().getRight() - maximumRotation)/columns; 
     double cellHeight = (heightProperty().doubleValue() 
       - getPadding().getTop() - getPadding().getBottom() - maximumRotation)/rows; 

     for (int i = 0; i < (rows); i++) { 
      for (int j = 0; j < (columns); j++) { 
       if (children.size() <= ((i * (columns)) + j)) { 
        break; 
       } 
       Node childNode = children.get((i * (columns)) + j); 
       layoutInArea(childNode, 
         (j * cellWidth) + getPadding().getLeft(), 
         (i * cellHeight) + getPadding().getTop(), cellWidth, cellHeight, 
         0.0d, HPos.CENTER, VPos.CENTER); 
      } 
     } 
    } 

    public void setBackgroundImage(Image backgroundImage){ 
     setBackground(new Background(
       new BackgroundImage(backgroundImage, 
         BackgroundRepeat.REPEAT, BackgroundRepeat.REPEAT, BackgroundPosition.CENTER, 
         BackgroundSize.DEFAULT))); 
    } 

    public void changeDisplayImage(Image newImageToDisplay){ 
     displayedImageProperty.set(newImageToDisplay); 
    } 

    public void captureAndSaveDisplay(){ 
     FileChooser fileChooser = new FileChooser(); 

     //Set extension filter 
     fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("png files (*.png)", "*.png")); 

     //Prompt user to select a file 
     File file = fileChooser.showSaveDialog(null); 

     if(file != null){ 
      try { 
       //Pad the capture area 
       WritableImage writableImage = new WritableImage((int)getWidth() + 20, 
         (int)getHeight() + 20); 
       snapshot(null, writableImage); 
       RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null); 
       //Write the snapshot to the chosen file 
       ImageIO.write(renderedImage, "png", file); 
      } catch (IOException ex) { ex.printStackTrace(); } 
     } 
    } 
} 

снимки экрана:

enter image description here enter image description here

Сохраненный Snap Shots:

enter image description here enter image description here

Смежные вопросы