java - 尝试打印包含来自 JavaFx 的图像的节点时的像素化结果
问题描述
我偶然发现了一个问题,试图通过 JavaFx 打印(到打印机或 pdf)图像。我的代码工作并打印,但在我尝试打印的每张图片上像素化(降低质量)。
我的代码是
package testingprinting;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Iterator;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.print.PageLayout;
import javafx.print.PageOrientation;
import javafx.print.Paper;
import javafx.print.Printer;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
/**
*
* @author me
*/
public class TestingPrinting extends Application {
@Override
public void start(Stage primaryStage) throws MalformedURLException {
GridPane leftGridPane = new GridPane();
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(25));
leftGridPane.getColumnConstraints().add(new ColumnConstraints(824));
VBox root = new VBox(1);
root.getChildren().add(leftGridPane);
Scene scene = new Scene(root, 1024, 800);
primaryStage.setTitle("Print Testing");
primaryStage.setScene(scene);
primaryStage.show();
Image testImage = new Image(new File("C:\\Users\\me\\Documents\\800px-Gull_portrait_ca_usa.JPG").toURI().toURL().toExternalForm());
ImageView testImageImageView = new ImageView();
testImageImageView.setFitWidth(800);
testImageImageView.setFitHeight(600);
testImageImageView.setImage(testImage);
leftGridPane.add(testImageImageView,0,0,9,1);
Button printButton = new Button("Print");
root.getChildren().add(printButton);
printButton.setOnAction(e -> {
//Printer pdfPrinter = null;
Iterator<Printer> iter = Printer.getAllPrinters().iterator();
while (iter.hasNext()) {
Printer printer = iter.next();
if (printer.getName().endsWith("PDF")) {
// pdfPrinter = printer;
}
}
Printer printer = Printer.getDefaultPrinter();
PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);
double scaleX = pageLayout.getPrintableWidth() / leftGridPane.getBoundsInParent().getWidth();
double scaleY = pageLayout.getPrintableHeight() / leftGridPane.getBoundsInParent().getHeight();
//leftGridPane.getTransforms().add(new Scale(scaleX, scaleY));
PrinterJob job = PrinterJob.createPrinterJob();
if(job != null){
System.out.println("Job is not null");
job.showPrintDialog(primaryStage); // Window must be your main Stage
job.printPage(leftGridPane);
job.endJob();
}
else { job.cancelJob(); System.out.println("Job is null");}
}
);
}
public static void main(String[] args) {
launch(args);
}
}
正如您在我剪下的图片上看到的 1. 来自打印并且图像是像素化的,2. 来自我运行的代码并且它不是像素化的。 并排比较
有人知道如何解决这个问题吗?
先感谢您。
解决方案
您可以尝试将打印机作业的打印质量设置为高。创建打印机作业调用后
job.getJobSettings().setPrintQuality(PrintQuality.HIGH);
我没有时间尝试,但它可能会有所帮助。
推荐阅读
- python - read_pdf FileNotFoundError:[Errno 2] 没有这样的文件或目录:在 Python 中
- c++ - 是否可以在 C++ 中的类和向量中存储一个 unique_ptr?
- c# - 是否可以在 WPF 的 MultiBinding QuickConverter 中使用带有参数的经典转换器?
- c - 如何用strtok函数替换字符-C?
- firebase - 理解 Firestore 安全规则 - 只允许更新某些字段
- python - 如何从python中的字符串中提取月份和年份?
- oauth-2.0 - 使用 EWS、OAuth2 和用户凭据访问用户邮箱
- reactjs - React 应用程序变慢并且 JS Heap 变大。如何发现内存泄漏?
- c# - 如何读取文本文件中一行的一部分?
- c# - 如何将对象转换为类型?