重新缩放图像以进行打印

时间:2015-01-27 08:24:06

标签: java printing scale rescale

我需要重新缩放图像以进行打印,但我只有两种不同的结果:

  • 图片比页面大。
  • 图像被切割,我只看到页面上一小部分图像。

我把两张图片看得更清楚了。第一个是我现在的结果:

enter image description here

第二个是我必须在页面上看到的图像,我必须重新缩放,因为它比页面大:

enter image description here

这可能是打印问题或方法" rescale"不起作用?我把我的代码放在下面:

public int print(Graphics g, PageFormat pf, int pageIndex) 
          {
            if (pageIndex != 0)
              return NO_SUCH_PAGE;
            Graphics2D g2 = (Graphics2D) g;
            g2.setFont(new Font("Serif", Font.PLAIN, 36));
            g2.setPaint(Color.black);
            g2.scale(200, 200);                 
            g2.drawImage(createImage(temperaturePlot), null, 20, 20);
            return PAGE_EXISTS;
          }

    public BufferedImage createImage(JPanel panel) 
   {
   int w = panel.getWidth();
   int h = panel.getHeight();
   BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
   Graphics2D g = bi.createGraphics();
   panel.paint(g);

   return bi;       
   }

我想要的只是缩放图像并查看页面上的所有值。

有任何帮助吗?谢谢!

我用新的共识改变了方法,但它不起作用:

class MyPrintableGraphic implements Printable 
        {
          public int print(Graphics g, PageFormat pf, int pageIndex) 
          {
            if (pageIndex != 0)
              return NO_SUCH_PAGE;

            BufferedImage original = createImage(temperaturePlot);

            original.getScaledInstance(200, 200,BufferedImage.SCALE_DEFAULT);

            Graphics2D g2 = (Graphics2D) g;
            g2.setFont(new Font("Serif", Font.PLAIN, 36));
            g2.setPaint(Color.black);
            //BufferedImage image = createImage(temperaturePlot); 
            //Image scaled = image.getScaledInstance(200,200,Image.SCALE_SMOOTH); 
            g2.drawImage(original, 0, 0, null);
            /*BufferedImage mbi = resizeImage(createImage(temperaturePlot), 200, 200);
            g2.drawImage(mbi, null, 20, 20);*/
            return PAGE_EXISTS;
          }
        }

以下是新的失败结果:

enter image description here

3 个答案:

答案 0 :(得分:0)

我用getScaledInstance缩放我的图像

BufferedImage.getScaledInstance(width,height,BufferedImage.SCALE_TYPE) 

这应该可以胜任。它会返回一个缓冲图像,当打印时,它具有您想要的宽度和高度

答案 1 :(得分:0)

以下是有关如何调整图片大小以及在JFrame中显示图片的示例:

public static void main(String[] args) throws IOException {
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100, 100, 400, 400);

    BufferedImage original = ImageIO.read(new File("img.jpg"));
    BufferedImage resized = resizeImage(original, frame.getWidth(), frame.getHeight());

    JPanel panel = new JPanel() {
        @Override protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(resized, 0, 0, null);
        }
    };

    frame.add(panel);
    frame.setVisible(true);
}

private static BufferedImage resizeImage(BufferedImage image, int width, int height) {
    // calculate the scale factor
    double xScale = width / (double) image.getWidth();
    double yScale = height / (double) image.getHeight();
    // create the object that will contain the resized image
    BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    // resize the image
    Graphics2D g = (Graphics2D) resizedImage.getGraphics();
    g.scale(xScale, yScale);
    g.drawImage(image, 0, 0, null);
    g.dispose();
    // return the resized image
    return resizedImage;
}

这是我将帧大小设置为400x400的结果:

Resized image - 400x400

这是600x400的框架:

Resized image - 600x400

如您所见,图像根据框架的大小进行拟合。

答案 2 :(得分:0)

尝试:

g2.drawImage(createImage(temperaturePlot).getScaledInstance(500, 300,BufferedImage.SCALE_SMOOTH), 85, 65, null);

我认为这可以解决您的问题。