Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4329866

Java2D printing exception in drawImage(BufferedImage, BufferedImageOp, int, int)

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • 1.4.0
    • 1.2.2, 1.3.0
    • client-libs
    • 2d
    • beta
    • generic, x86
    • generic, windows_nt



      Name: rlT66838 Date: 04/12/2000


      4 Mar 2000 -- reproducible (see below)

      java version "1.2.2"
      Classic VM (build JDK-1.2.2-004, native threads, symcjit)

      1. Unable to print a BufferedImage (Graphics2D). Running the sample code,
      snipped out of the application, illustrates the problem.

      2. SOURCE CODE:
      -----------------------------------------------------------------------
      // more than needed
      import java.util.*;
      import java.text.*;
      import java.io.*;
      import java.net.*;
      import java.awt.*;
      import java.awt.font.*;
      import java.awt.geom.*;
      import java.awt.print.*;
      import java.awt.event.*;
      import java.awt.image.*;
      import java.awt.image.renderable.*;
      import javax.swing.*;
      import javax.swing.text.*;
      import javax.swing.border.*;
      import javax.swing.event.*;

      public class PrintTest
      {
          protected static final String IMAGE_EXTENSION = ".jpg";
          protected static final String FRONT_EXTENSION = "front" + IMAGE_EXTENSION;
          protected static final String BACK_EXTENSION = "back" + IMAGE_EXTENSION;

          protected static final double _hwBorder = 72 / 4; // 1/4 inch
          protected static final double _border = 72 / 4; // 1/4 inch
          protected static final int _objectBorder = 15;
          protected static final int _verticalGap = 20;
          protected static final int _textIndent = 150;

          protected BufferedImage _image;

          protected PageFormat _pageFormat;

          public PrintTest(BufferedImage image) {
              _image = image;
              PrinterJob pj = PrinterJob.getPrinterJob();
              _pageFormat = pj.defaultPage();
          }


          protected int printImage(Graphics g, PageFormat pf, BufferedImage image) {
              Graphics2D g2D = (Graphics2D)g;
              g2D.transform(new AffineTransform(_pageFormat.getMatrix()));

              int paperW = (int)pf.getImageableWidth(), paperH = (int)
      pf.getImageableHeight();

              int x = (int)pf.getImageableX(), y = (int)pf.getImageableY();
              g2D.setClip(x, y, paperW, paperH);
              System.out.println("clip=" + g2D.getClip());

              // print images
              if (image != null ) {
                  int imageH = image.getHeight(), imageW = image.getWidth();
                  // make slightly smaller (25) than max possible width
                  float scaleFactor = ((float)((paperW - 25) - _objectBorder -
      _objectBorder) / (float)(imageW));
                  System.out.println("drawingImage: scale=" + scaleFactor + ", " +
      image);
                  int scaledW = (int)(imageW * scaleFactor), scaledH = (int)(imageH *
      scaleFactor);
                  System.out.println("scaledW x scaledH=" + scaledW + "x" + scaledH);

                  Shape outline = new RoundRectangle2D.Double(x, y, _objectBorder +
      scaledW + _objectBorder, _objectBorder + scaledH + _objectBorder, _objectBorder
      * 2, _objectBorder * 2);
                  System.out.println("Outline=" + outline.getBounds2D());
                  g2D.setColor(Color.gray);
                  g2D.fill(outline);

                  // **** test code to create some image, should be coverred up ****
                  g2D.setColor(Color.lightGray);
                  Shape object = new Rectangle2D.Double(x + _objectBorder, y +
      _objectBorder, scaledW, scaledH);
                  System.out.println("Bounds=" + object.getBounds2D());
                  g2D.fill(object);
                  g2D.setColor(Color.black);
                  g2D.drawLine(x + _objectBorder, y + _objectBorder, x +
      _objectBorder + scaledW, y + _objectBorder + scaledH);
                  g2D.drawLine(x + _objectBorder, y + _objectBorder + scaledH, x +
      _objectBorder + scaledW, y + _objectBorder);

                  BufferedImageOp scaleOp = new RescaleOp(scaleFactor, 0, null);
                  g2D.drawImage(image, scaleOp, x + _objectBorder, y + _objectBorder);
                  y += _objectBorder + scaledH + _objectBorder;
                  System.out.println("drawingImage done");
                  return Printable.PAGE_EXISTS;
              }
              else {
                  return Printable.NO_SUCH_PAGE;
              }
          }

          public void print() {
              try {
                  final PrinterJob pj = PrinterJob.getPrinterJob();
                  pj.setJobName("Print Image");
                  pj.setPrintable(new Printable() {
                      public int print(Graphics g, PageFormat pf, int pageIndex) {
                          System.out.println("Image Printing page " + pageIndex);
                          int result = NO_SUCH_PAGE;
                          if (pageIndex == 0) {
                              result = printImage(g, _pageFormat, _image);
                              System.out.println("Image Printed page " + pageIndex
      + ", result=" + result);
                          }
                          return result;
                      }
                  });
                  System.out.println("Starting print image submission");
                  pj.print();
                  System.out.println("Print submission complete");
              }
              catch (Exception e) {
                  e.printStackTrace(System.out);
              }
          }

          public static void main(String[] args) {
              BufferedImage image = prepareTestImage(args.length == 0 ? "" : args[0]);
              PrintTest pt = new PrintTest(image);
              pt.print();
          }

          // image must be filly loaded
          public static BufferedImage toBufferedImage(Image image, int type) {
              BufferedImage result = null;
              if (image != null) {
                  int width = image.getWidth(null), height = image.getHeight(null);
                  if (width > 0 && height > 0) {
                      System.out.println("Converting " + height + "x" + width);
                      result = new BufferedImage(width, height, type);
                      Graphics2D g2D = result.createGraphics();
                      g2D.drawImage(image, null, null);
      // System.out.println("Convertion complete");
                  }
              }
              return result;
          }

          public static byte[] getFileBytes(String name) {
              byte[] result = null;
              BufferedInputStream bis = null;
              try {
                  File file = new File(name);
                  if (file.exists() && file.isFile()) {
                      int flen = (int)file.length();
                      result = new byte[flen];
                      bis = new BufferedInputStream(new FileInputStream(file),
      Math.min(64 * 1024, flen));
                      bis.read(result, 0, result.length);
                  }
              }
              catch (IOException ioe) {
                  System.out.println(ioe);
                  if (bis != null) {
                      try { bis.close(); } catch (IOException ioe2) {}
                  }
              }
              return result;
          }

          public static BufferedImage prepareFrontImage() {
              // build my own test images
              BufferedImage result = new BufferedImage(400, 200,
      BufferedImage.TYPE_BYTE_GRAY);

              Graphics2D g2D = (Graphics2D)result.getGraphics();
              g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
      RenderingHints.VALUE_ANTIALIAS_OFF);

              int w = result.getWidth(), h = result.getHeight();

              //g2D.setPaint(ImagePanel.BACKGROUND.brighter());
              g2D.fill(new Rectangle(0, 0, w, h));

              g2D.setColor(Color.white);
              g2D.draw3DRect(10, 10, w - 20, h - 20, true);

              AffineTransform original = g2D.getTransform();
              AffineTransform originXform = AffineTransform.getTranslateInstance(w /
      5, h / 5);
              g2D.transform(originXform);

              Color[] colors = new Color[36];
              float colorDelta = 1.0F / colors.length;
              float hue = 0.0F;
              for (int i = 0; i < colors.length; i++) {
                  colors[i] = Color.getHSBColor(hue, 0.5F, 0.75F);
                  hue += colorDelta;
              }

              g2D.setFont(new Font("Courier", Font.BOLD, 32));
              for (int i = 0; i < 5; i++ ) {
                  AffineTransform save = g2D.getTransform();

                  g2D.setColor(colors[i % colors.length]);
                  AffineTransform rotateXform = AffineTransform.getRotateInstance(2 *
      Math.PI * ((float)i / colors.length));
                  g2D.transform(rotateXform);
                  AlphaComposite overComposite = AlphaComposite.getInstance
      (AlphaComposite.SRC_OVER, Math.min(1.0f, 0.5f + (((float)i / colors.length) /
      2.0f)));
                  g2D.setComposite(overComposite);
                  g2D.drawString("Number " + i, 0, 0);

                  g2D.setTransform(save);
              }
              g2D.setTransform(original);
              g2D.setFont(new Font("Courier", Font.BOLD, 12));
              g2D.setColor(Color.red);
              g2D.drawString("Front Side", 20, h / 2);

              return result;
          }

          public static final int LOAD_IMAGE_TYPE = BufferedImage.TYPE_BYTE_GRAY;

          public static BufferedImage prepareTestImage(String suffix) {
              BufferedImage result = null;

              // first try for a file images
              System.out.println("Loading image" + suffix + FRONT_EXTENSION);
              byte[] data0 = getFileBytes("image" + suffix + FRONT_EXTENSION);
              if (data0 != null) {
                  ImageIcon icon0 = new ImageIcon(data0);
                  Image image0 = icon0.getImage();
                  result = toBufferedImage(image0, LOAD_IMAGE_TYPE);
              }
              else {
                  System.out.println("Cannot load front image; building image
      instead");
                  result = prepareFrontImage();
              }
              System.out.println("Result=" + result);

              return result;
          }
      }

      3. ERROR MESSAGE:
      -----------------------------------------------------------------------
      java.lang.ClassCastException: java.awt.image.BufferedImage
      at sun.java2d.PeekGraphics.drawImage(PeekGraphics.java:1374)
      at PrintTest.printImage(PrintTest.java:75)
      at PrintTest$1.print(PrintTest.java:94)
      at sun.java2d.RasterPrinterJob.printPage(RasterPrinterJob.java:485)
      at sun.java2d.RasterPrinterJob.print(RasterPrinterJob.java:235)
      at PrintTest.print(PrintTest.java:101)
      at PrintTest.main(PrintTest.java:112)


      ------------------

      4 Mar 2000, eval1127@eng -- got the same results:

      java.lang.ClassCastException: java.awt.image.BufferedImage
              at sun.java2d.PeekGraphics.drawImage(PeekGraphics.java:1383)
              at PrintTest101828.printImage(PrintTest101828.java:95)
              at PrintTest101828$1.print(PrintTest101828.java:114)
              at sun.java2d.RasterPrinterJob.printPage(RasterPrinterJob.java:677)
              at sun.java2d.RasterPrinterJob.print(RasterPrinterJob.java:342)
              at PrintTest101828.print(PrintTest101828.java:122)
              at PrintTest101828.main(PrintTest101828.java:133)

      -----------

      (full results:)

      Loading imagefront.jpg
      Converting 79x80
      Result=BufferedImage@b4b2f: type = 10 ColorModel: #pixelBits = 8 numComponents = 1 color space = java.awt.color.ICC_ColorSpace@750159 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 80 height = 79 #numDataElements 1 dataOff[0] = 0
      Starting print image submission
      Image Printing page 0
      clip=java.awt.Rectangle[x=72,y=72,width=468,height=648]
      drawingImage: scale=5.1625, BufferedImage@b4b2f: type = 10 ColorModel: #pixelBits = 8 numComponents = 1 color space = java.awt.color.ICC_ColorSpace@750159 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 80 height = 79 #numDataElements 1 dataOff[0] = 0
      scaledW x scaledH=413x407
      Outline=java.awt.geom.Rectangle2D$Double[x=72.0,y=72.0,w=443.0,h=437.0]
      Bounds=java.awt.geom.Rectangle2D$Double[x=87.0,y=87.0,w=413.0,h=407.0]
      java.lang.ClassCastException: java.awt.image.BufferedImage
              at sun.java2d.PeekGraphics.drawImage(PeekGraphics.java:1383)
              at PrintTest101828.printImage(PrintTest101828.java:95)
              at PrintTest101828$1.print(PrintTest101828.java:114)
              at sun.java2d.RasterPrinterJob.printPage(RasterPrinterJob.java:677)
              at sun.java2d.RasterPrinterJob.print(RasterPrinterJob.java:342)
              at PrintTest101828.print(PrintTest101828.java:122)
              at PrintTest101828.main(PrintTest101828.java:133)
      (Review ID: 101828)
      ======================================================================

            jgodinez Jennifer Godinez (Inactive)
            rlewis Roger Lewis (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: