我有一个应用程序,它在JPanel中使用JButtons和JLabel来大量利用swing组件。我使用GridBagLayout来布局这些组件,并在屏幕上显示它们很好。如果重要的话,在Windows上运行。
我一直在努力解决的问题与打印图像的清晰度有关,无论是打印成纸还是jpg。图像看起来很浑浊。按钮的边缘,按钮或标签内的文本,甚至直线看起来都很模糊。
下面是一个生成50x50 jpg的示例,其中包含一个40x40的矩形。矩形内外似乎有一条微弱的阴影线,角落处有微弱的点,甚至线条的边缘看起来都很模糊。我也看到了与swing组件相同的结果。
在我的搜索和阅读中,我发现了许多对RenderingHints的引用,但是我看到了太多关于“尝试设置此”的形式的建议而没有任何解释来辨别哪些提示可能适用。< / p>
任何建议/指示都将不胜感激。
import java.lang.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;
public class MyFrame extends JFrame {
public static void main(String[] args) {
new MyFrame();
}
MyFrame() {
JButton button;
button = new JButton("print jpg");
button.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent evt) {
takePicture();
}
});
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
add(button);
pack();
setVisible(true);
}
void takePicture() {
BufferedImage img = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,50,50);
g.setColor(Color.black);
g.drawRect(5,5,40,40);
try {
ImageIO.write(img, "jpg", new File("output_file.jpg") );
}
catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
你看到的可能是JPEG compression artifacts.如果你将使用一些无损格式(如PNG),你将获得所需的图像。
这是输出完美清晰矩形的版本:
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;
public class PrintImage {
public static void main(String[] args) throws Exception {
BufferedImage img = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) img.getGraphics();
g.setColor(Color.white);
g.fillRect(0,0,50,50);
g.setColor(Color.black);
g.drawRect(5,5,40,40);
ImageIO.write(img, "png", new File("output_file.png") );
}
}
请注意,我使用png作为输出格式 - 与jpg不同,它不会丢失信息以节省空间。
另外,请确保放大时图像查看器不会尝试插入像素 - 否则您会看到模糊的线条。图像编辑软件通常不这样做,因此您可以使用Paint来检查您确实拥有所需的图像。