-
Bug
-
Resolution: Fixed
-
P4
-
1.2.2, 1.3.0
-
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)
======================================================================