Printing a BufferedImage in Java

后端 未结 4 1786
春和景丽
春和景丽 2021-01-25 19:34

Does anyone know how to print a BufferedImage in Java?

相关标签:
4条回答
  • 2021-01-25 20:03

    Printing is just like drawing on the screen, so eventually you get a Graphics object, and you just drawImage into it.

    0 讨论(0)
  • 2021-01-25 20:15

    I'm trying to do that by extending BufferedImage to implement the Printable interface like so (a collage of code I found from around the web):

    package components;
    import java.awt.image.PixelGrabber;
    import javax.swing.*;
    import java.io.*;
    import java.awt.*;
    import java.applet.Applet;
    import javax.imageio.*;
    import java.awt.Image.*;
    import java.awt.image.BufferedImage;
    import java.awt.image.ImageObserver;
    import java.net.*;
    import java.lang.*;
    import java.io.*;
    import java.io.File;
    import java.lang.Integer;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.RenderingHints;
    import java.lang.String;
    import java.io.File;
    import java.util.Iterator;
    import javax.imageio.*;
    import javax.imageio.stream.*;
    import java.lang.ClassLoader.*;
    import java.lang.Class;
    import java.io.*;
    import javax.print.*;
    import javax.print.attribute.*;
    import javax.print.attribute.standard.*;
    import javax.print.attribute.standard.MediaSize.*;
    import javax.print.event.*;
    import java.awt.MediaTracker;
    import java.awt.Color;
    import java.awt.*;
    import java.awt.print.*;
    import javax.print.attribute.*;
    import javax.swing.UIManager;
    import java.awt.image.ColorModel;
    import java.awt.image.WritableRaster;
    import java.util.Hashtable;
    import java.awt.image.IndexColorModel;
    import java.awt.print.Printable.*;
    import java.awt.Rectangle;
    import java.awt.Graphics2D;
    
    public class printableBufferedImage extends BufferedImage implements Printable
    {
       public printableBufferedImage(ColorModel cm, WritableRaster raster, boolean     isRasterPremultiplied, Hashtable properties) 
       {
          super(cm, raster, isRasterPremultiplied, properties);
       }
       public printableBufferedImage(int width, int height, int imageType)
       {
          super(width, height, imageType);
       }
       public printableBufferedImage(int width, int height, int imageType, IndexColorModel cm) 
       {
          super(width, height, imageType, cm);
       }
    
    
    public int print(Graphics g, PageFormat pf, int page) throws
                                                        PrinterException {
    
        Graphics2D g2d = (Graphics2D) g;
    
        if (page > 0) { /* We have only one page, and 'page' is zero-based */
            return NO_SUCH_PAGE;
        }
    
        /* User (0,0) is typically outside the imageable area, so we must
         * translate by the X and Y values in the PageFormat to avoid clipping
         */
    
         try
        {
    
         g2d.setClip(0,0,2100,3300);
         g2d.drawImage(this, 225, 0,null);
         g2d.drawImage(this,225, 1550,null);
        }
        catch(Exception exc)
        {
        }
        /* tell the caller that this page is part of the printed document */
          //return NO_SUCH_PAGE;
        return PAGE_EXISTS;
    }
    
     public BufferedImage resizeOurImageFromImage(BufferedImage OurImage, int targetWidth, int targetHeight)
     throws Exception
     {
       double tempWidth, tempHeight;
       int w,h,type;
       Boolean OurImageHasAlpha;
       OurImageHasAlpha = OurImage.getColorModel().hasAlpha();
       if(OurImageHasAlpha)
       {
          type = BufferedImage.TYPE_INT_ARGB;
       }
       else
       {
          type = BufferedImage.TYPE_INT_RGB;
       }
    
    
       w = OurImage.getWidth();
       h = OurImage.getHeight();
    
       if((targetWidth == 0) && (targetHeight != 0))
       {
          targetWidth = (targetHeight * w) / h;
       }
       else
       {
         if((targetHeight == 0) && (targetWidth != 0))
         {
           targetHeight = (targetWidth * h) / w;
         }
       }
    
       if((targetHeight == 0) || (targetWidth == 0))
       {
         throw(new Exception("In the Resize Image module with one dimension still zero after trying proportion"));
       }
            do
            {
               if(w > targetWidth)
               {
                  tempWidth = ((double) w)/1.2;
                  if (tempWidth < (double) targetWidth)
                  {
                     w = targetWidth;
                  }
                  else
                  {
                     w = (int) java.lang.Math.round(tempWidth + 0.49);
                  }
               }
               else
               {
                 w = targetWidth;
               }
               if(h > targetHeight)
               {
                 tempHeight = ((double) h)/1.2;
                 if (tempHeight < (double) targetHeight)
                 {
                    h = targetHeight;
                 }
                 else
                 {
                     h = (int) java.lang.Math.round(tempHeight + 0.49);
                 }
              }
              else
              {
                h = targetHeight;
              }
              BufferedImage tmp = new BufferedImage(w, h, type);
              Graphics2D g2 = tmp.createGraphics();
              g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
              g2.drawImage(OurImage, 0, 0, w, h, null);
              g2.dispose();
              OurImage = tmp;
              } while ((targetHeight != h) || (targetWidth != w));
    
       return OurImage;
     }
    }
    
    0 讨论(0)
  • 2021-01-25 20:15

    check my solved problem here: Java PrinterJob, high quality printing ends up with 72 DPI anyway the solution was to draw the image to paintComponent(Graphics g) method for a JPanel and pass this panel to Print utility class, at that class you can easily scale the image/Panel as you want preserving the image high quality, it sounds the same but the result was not, i read an advice about using the image outside "onscreen graphics context" but had no idea how to do that until i tried this solution, try it

    0 讨论(0)
  • 2021-01-25 20:18

    I'm not sure what you mean by print. Print on a printer? Print to standard out? Write to a file?

    You can check out this tutorial from sun. If you're looking to write to a file. Open in your favorite image tool and print from there.

    http://download.oracle.com/javase/tutorial/2d/images/saveimage.html

    If you're building a graphical app and using something like AWT you can using the java printing API which would probably require some tap dancing.

    0 讨论(0)
提交回复
热议问题