为什么Java打印的图像模糊?

时间:2015-05-21 13:56:00

标签: java swing

我有一个应用程序,它在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();
    }

  }
}

1 个答案:

答案 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来检查您确实拥有所需的图像。