2015-07-09 21 views
0

3D打印片我创建STL文件SVG片填充图案。 SVG文件由许多行组成。简短的版本是我无法使用JavaFX的内置功能来创建SVG的填充模式。原因在于SVG没有正确创建,因为代码先移动然后移动然后移动然后行。要使用填充功能,我认为你需要一个动作,然后多行。很久以前,要记住确切的问题。我想创建一个用于JavaFX中/ Java的

原来这就是我现在做我解决存储填充图案,蜂窝状的填充图案的问题 ,在一个文件中。这可以存储在内存中,但它用于测试。然后我在第二个文件中存储一个空心切片。我需要将两者结合起来,以便只去除层/切片显示内部和其余部分的蜂窝部分。蜂窝应该是白色的,切片也应该是白色的。这个计划是当我将它复制到切片上时使蜂窝变成白色。

我尝试了两种方法。

我尝试的第一个方法是从填充图案的层/片复制像素。我试图找出图层的位置,然后尝试找出内部和外部的位置。我失败了。代码将附在本问题的底部。

我尝试第二种方法是使用应用blendMode,但没有一个模式似乎做什么,我需要做的。

首先方法代码 我试图保存的蜂窝和层以不同的颜色,我试图保存它们在彼此的顶部上,然后取下蜂窝。在这里你可以看到,我想弄清楚里面是什么,什么是外面,但我不能让它使用混合 工作

package javaapplication3; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.image.PixelReader; 
import javafx.scene.image.PixelWriter; 
import javafx.scene.image.WritableImage; 
import javafx.scene.paint.Color; 
import javax.imageio.ImageIO; 

public class JavaApplication3 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     try { 
      File file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill0.gizmoslice.png"); 
      BufferedImage bufImage = ImageIO.read(file); 

      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null); 

      PixelReader pixelReader = writableImage.getPixelReader(); 
      int width = (int) writableImage.getWidth(); 
      int height = (int) writableImage.getHeight(); 

      WritableImage dest = new WritableImage(width, height); 
      PixelWriter writer = dest.getPixelWriter(); 
      boolean isOnLine = false; 
      boolean previousIsOnLine = false; 
      boolean isInside = false; 
      for (int x = 0; x < width; x++) { 
       for (int y = 00; y < height; y++) { 
        // reading a pixel from src image, 
        // then writing a pixel to dest image 
        Color color = pixelReader.getColor(x, y); 
        double red = color.getRed(); 
        double green = color.getGreen(); 
        double blue = color.getBlue(); 

        if (red == 0 && green == 1 && blue == 0) { 
         //isInside = !isInside; 
         isOnLine = true; 
        } else { 
         previousIsOnLine = isOnLine; 
         isOnLine = false; 
        } 

        if (previousIsOnLine) { 
         isInside = !isInside; 
        } 

        /*if (isOnLine && red == 1 && green == 0 && blue == 0) { 
         isInside = true; 
         isOnLine = false; 
        }*/ 

        if (isOnLine || isInside) { 
         writer.setColor(x, y, color); 
        } 
        /*if (isOnLine || isInside && (red > 0 && green == 0 && blue == 0)) { 
         writer.setColor(x, y, Color.WHITE); 
        }*/ 

       } 
      } 


      File outputFile = new File("C:\\Temp\\Mandibular\\test.png"); 
      ImageIO.write(SwingFXUtils.fromFXImage(dest, null), "png", outputFile); 

     } catch (IOException ex) { 
      Logger.getLogger(JavaApplication3.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

第二种方法我试过不同的混合模式,并结束了最后一个layerView.setBlendMode(BlendMode.SRC_ATOP);这显然不符合我的需要。我只是测试每一个来看看发生了什么工作

package javafxapplication15; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.SnapshotParameters; 
import javafx.scene.control.Button; 
import javafx.scene.effect.BlendMode; 
import javafx.scene.image.ImageView; 
import javafx.scene.image.WritableImage; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javax.imageio.ImageIO; 

public class JavaFXApplication15 extends Application { 
    private void doWork() { 
     try { 
      // TODO code application logic here 
      File file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill0.gizmoslice.png"); 
      BufferedImage layerImage = ImageIO.read(file); 

      file = new File("C:\\Temp\\Mandibular\\MandibularsolidNOreferencepoints.gizmofill-1.gizmoslice.png"); 
      BufferedImage fillImage = ImageIO.read(file); 

      WritableImage layerWritableImage = SwingFXUtils.toFXImage(layerImage, null); 
      WritableImage fillWritableImage = SwingFXUtils.toFXImage(fillImage, null); 

      WritableImage temp = copyImageOntoFillPattern(fillWritableImage, layerWritableImage); 


      File outputFile = new File("C:\\Temp\\Mandibular\\test.png"); 
      ImageIO.write(SwingFXUtils.fromFXImage(temp, null), "png", outputFile); 
     } catch (IOException ex) { 
      Logger.getLogger(JavaFXApplication15.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
    private WritableImage copyImageOntoFillPattern(final WritableImage fillPatternImage, final WritableImage sourceImage) { 

     ImageView fillPatternView = new ImageView(fillPatternImage); 
     ImageView layerView = new ImageView(sourceImage); 
     layerView.setBlendMode(BlendMode.SRC_ATOP); 

     Group blend = new Group(fillPatternView, layerView); 

     blend.snapshot(null, sourceImage); 
     SnapshotParameters param = new SnapshotParameters(); 
     final WritableImage snapshotCombined = blend.snapshot(param, null); 
     return snapshotCombined; 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 
       doWork(); 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 

Layer

Honeycomb fill pattern and layer

回答

0

我点击周围也许一个小时改变.fxml文件

这里是文件的内容,我需要将它转换为我可以运行的代码,但现在不应该太难。

需要填充层,填充颜色似乎并不重要。我将它制作成绿色,以便它可以在网站上看到,但是当我在切片机中创建它时,我可能会将它创建为白色。我也制作了蜂窝状的红色,以便更容易看到。我表示在它的工作

我现在只需要创建一个蜂窝状的白色和层为纯白色和SceneBuilder的形象的东西将是巨大的

Slice or Layer

Honeycomb

Combination in Scene Builder

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.effect.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <Group blendMode="HARD_LIGHT"> 
     <children> 
      <ImageView blendMode="DIFFERENCE" cache="true" fitHeight="418.0" fitWidth="591.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@outline.png" /> 
       </image> 
      </ImageView> 
      <ImageView blendMode="SRC_ATOP" fitHeight="451.0" fitWidth="688.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@honeycomb.png" /> 
       </image> 
       <effect> 
        <Blend mode="ADD" /> 
       </effect> 
      </ImageView> 
     </children> 
     </Group> 
    </children> 
</AnchorPane> 
相关问题