Я создаю срезы SVG из файлов STL. Файлы SVG состоят из множества строк. Короче говоря, я не могу использовать встроенные функции JavaFX для создания шаблона заполнения SVG. Причина была связана с тем, что SVG не создается правильно, потому что код выполняет перемещение, а затем линию, а затем перемещается, а затем линия. Чтобы использовать функцию заполнения, я думаю, вам нужно иметь один ход, а затем много строк. Слишком давно, чтобы вспомнить точный вопрос.Я хочу создать шаблон заливки для 3D-печати в 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);
}
}
}
Второй метод с использованием смеси Я попробовал различные blendModes и закончился последний один 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);
}
}