diff servlet/src/digilib/image/ImageLoaderDocuImage.java @ 140:c878ea574c29

Servlet Version 1.12b2 - fixed small error in XML config parser - improved high quality scaling with minSubsample parameter
author robcast
date Fri, 15 Aug 2003 23:52:20 +0200
parents a32e8c80e2f2
children d87a7e2515af
line wrap: on
line diff
--- a/servlet/src/digilib/image/ImageLoaderDocuImage.java	Thu Jul 31 20:56:51 2003 +0200
+++ b/servlet/src/digilib/image/ImageLoaderDocuImage.java	Fri Aug 15 23:52:20 2003 +0200
@@ -120,6 +120,12 @@
 		ImageInputStream istream = ImageIO.createImageInputStream(rf);
 		Iterator readers = ImageIO.getImageReaders(istream);
 		reader = (ImageReader) readers.next();
+		/* are there more readers?
+		System.out.println("this reader: " + reader.getClass());
+		while (readers.hasNext()) {
+			System.out.println("next reader: " + readers.next().getClass());
+		}
+		*/
 		reader.setInput(istream);
 		if (reader == null) {
 			util.dprintln(3, "ERROR(loadImage): unable to load file");
@@ -168,6 +174,35 @@
 				util.dprintln(2, "ERROR(writeImage): Unknown mime type " + mt);
 				throw new FileOpException("Unknown mime type: " + mt);
 			}
+
+			/* JPEG doesn't do transparency so we have to convert any RGBA image
+			 * to RGB :-(
+			 */
+			if ((type == "jpeg") && (img.getColorModel().hasAlpha())) {
+				util.dprintln(2, "BARF: JPEG with transparency!!");
+				int w = img.getWidth();
+				int h = img.getHeight();
+				// BufferedImage.TYPE_INT_RGB seems to be fastest (JDK1.4.1, OSX)
+				BufferedImage img2;
+				img2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+				img2.createGraphics().drawImage(img, null, 0, 0);
+				img = img2;
+			}
+
+			/* try ImageWriter.write
+			Iterator writers = ImageIO.getImageWritersByFormatName(type);
+			ImageWriter writer = (ImageWriter) writers.next();
+			System.out.println("this writer: " + writer.getClass());
+			while (writers.hasNext()) {
+				System.out.println("next writer: " + writers.next().getClass());
+			}
+			//ImageWriteParam param = writer.getDefaultWriteParam();
+			IIOImage iimg = new IIOImage(img, null, null); 
+			ImageOutputStream iostream = new MemoryCacheImageOutputStream(ostream);
+			writer.setOutput(iostream);
+			writer.write(iimg);
+			*/
+
 			// render output
 			if (ImageIO.write(img, type, ostream)) {
 				// writing was OK
@@ -187,7 +222,8 @@
 			new AffineTransformOp(
 				AffineTransform.getScaleInstance(scale, scale),
 				interpol);
-		BufferedImage scaledImg = scaleOp.filter(img, null);
+		BufferedImage scaledImg = scaleOp.createCompatibleDestImage(img, null);
+		scaleOp.filter(img, scaledImg);
 
 		if (scaledImg == null) {
 			util.dprintln(2, "ERROR(cropAndScale): error in scale");
@@ -276,8 +312,7 @@
 		return fb;
 	}
 
-	public void rotate(double angle)
-		throws ImageOpException {
+	public void rotate(double angle) throws ImageOpException {
 		// setup rotation
 		double rangle = Math.toRadians(angle);
 		// create offset to make shure the rotated image has no negative coordinates
@@ -294,7 +329,8 @@
 		double xoff = rotbounds.getX();
 		double yoff = rotbounds.getY();
 		// move image back in line
-		trafo.preConcatenate(AffineTransform.getTranslateInstance(-xoff, -yoff));
+		trafo.preConcatenate(
+			AffineTransform.getTranslateInstance(-xoff, -yoff));
 		// transform image
 		rotOp = new AffineTransformOp(trafo, interpol);
 		BufferedImage rotImg = rotOp.filter(img, null);