view src/kryshen/tema/ImageConverter.java @ 0:1d2fe61a3a62

Tema 0.1 (imported from CVS).
author Mikhail Kryshen <mikhail@kryshen.net>
date Tue, 16 May 2006 18:04:09 +0400
parents
children
line source
1 /*
2 * Copyright (C) 2005, 2006 Mikhail A. Kryshen
3 *
4 * $Id: ImageConverter.java,v 1.1.1.1 2006/05/16 14:04:09 mikhail Exp $
5 */
7 package kryshen.tema;
9 import java.util.*;
10 import java.io.*;
11 import java.awt.*;
12 import java.awt.image.*;
13 import java.awt.geom.AffineTransform;
14 import javax.imageio.*;
15 import javax.imageio.stream.*;
17 /**
18 * Class defines static method to convert images to specified format.
19 *
20 * @author Mikhail A. Kryshen
21 */
22 class ImageConverter {
24 static void convert(File source, File dest, String format,
25 int maxWidth, int maxHeight)
26 throws IOException, InterruptedException {
28 System.err.print("Converting image " + source + "... ");
30 if (source.lastModified() < dest.lastModified()) {
31 System.err.println(dest + " is up to date.");
32 return;
33 }
35 BufferedImage image = ImageIO.read(source);
37 //int type = image.getType();
38 //final int type = BufferedImage.TYPE_INT_RGB;
39 //ColorModel cm = image.getColorModel();
41 int w = image.getWidth(null);
42 int h = image.getHeight(null);
44 //boolean scale = false;
46 float scale = 1f;
48 if (maxWidth > 0 && w > maxWidth)
49 scale = (float)maxWidth / w;
51 if (maxHeight > 0 && h * scale > maxHeight)
52 scale = (float)maxHeight / h;
54 if (scale != 1f) {
55 w *= scale; h *= scale;
57 // ColorModel cm = image.getColorModel();
58 // boolean alphaPremultiplied = cm.isAlphaPremultiplied();
59 // WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
60 // BufferedImage scaled = new BufferedImage
61 // (cm, raster, alphaPremultiplied, null);
63 // BufferedImage scaled = new BufferedImage(w, h, image.getType());
66 Image scaled = image.getScaledInstance(w, h, Image.SCALE_SMOOTH);
68 ColorModel cm = image.getColorModel();
69 boolean alphaPremultiplied = image.isAlphaPremultiplied();
70 WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
71 image = new BufferedImage(cm, raster, alphaPremultiplied, null);
73 Graphics g = image.getGraphics();
74 g.drawImage(scaled, 0, 0, null);
75 g.dispose();
77 // image = scale(image, scaled, scale);
78 // Graphics2D g = scaled.createGraphics();
79 // g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
80 // RenderingHints.VALUE_INTERPOLATION_BILINEAR);
81 // System.err.print(" " + g.drawImage(image, 0, 0, w, h, null) + " ");
82 // g.dispose();
83 // image = scaled;
84 }
86 File parent = dest.getParentFile();
87 if (parent != null) parent.mkdirs();
89 ImageIO.write(image, format, dest);
90 System.err.println("saved " + dest + ".");
91 }
93 // public static ColorModel getColorModel(Image image)
94 // throws InterruptedException {
96 // PixelGrabber grabby = new PixelGrabber(image, 0, 0, 1, 1, false);
97 // if (!grabby.grabPixels())
98 // throw new RuntimeException("pixel grab fails");
99 // return grabby.getColorModel();
100 // }
102 // private static BufferedImage scale(BufferedImage image,
103 // BufferedImage dest,
104 // float scale) {
106 // AffineTransform tx = new AffineTransform();
107 // tx.scale(scale, scale);
109 // AffineTransformOp op = new AffineTransformOp
110 // (tx, AffineTransformOp.TYPE_BILINEAR);
112 // return op.filter(image, dest);
113 // }
115 // TEST
117 public static void main(String[] args)
118 throws IOException, InterruptedException {
120 convert(new File(args[0]), new File(args[1]), "png", 300, 300);
121 }
124 // public static BufferedImage toBufferedImage(Image image, ColorModel cm) {
125 // if (image instanceof BufferedImage)
126 // return (BufferedImage)image;
128 // int w = image.getWidth(null);
129 // int h = image.getHeight(null);
131 // boolean alphaPremultiplied = cm.isAlphaPremultiplied();
132 // WritableRaster raster = cm.createCompatibleWritableRaster(w, h);
133 // BufferedImage result = new BufferedImage(cm, raster, alphaPremultiplied, null);
134 // Graphics2D g = result.createGraphics();
136 // g.drawImage(image, 0, 0, null);
137 // g.dispose();
139 // return result;
140 // }
141 }
144 // This is how I'd recommend it in JDK1.4 using javax.imageio.ImageIO to
145 // do the reading/writing and Java2D to do the scaling.
147 // // read in the original image
148 // BufferedImage in = ImageIO.read(new File("in.jpg"));
150 // // create a new image of the smaller size
151 // BufferedImage out = new BufferedImage(newWidth, newHeight);
153 // // get the graphics associated with the new image
154 // Graphics g = out.getGraphics();
156 // // draw the original image into the new image, scaling
157 // // on the fly
158 // g.drawImage(in, newWidth, newHeight, null);
160 // // dispose the graphics object
161 // g.dispose();
163 // // write out the new image
164 // ImagIO.write("out.jpg", "jpeg", new File("out.jpg"));
166 // ------------------------------------------
168 // For nicer scaling, you could add a rendering hint to the graphics
169 // object before painting.
171 // ie.
173 // Graphics2D g2d = (Graphics2D)g;
174 // g2d.setRenderingHint(RenderingHints.KEY_INTEPOLATION,
175 // RenderingHints.VALUE_INTERPOLATION_BILINEAR);
177 // or use VALUE_INTERPOLATION_BICUBIC for the best.
179 // But as you can guess, nicer == slower.
181 // Shannon Hickey
182 // shann...@swingteam.com
183 // Swing Team http://TheSwingConnection.com http://TheJavaTutorial.com
184 // Java Software, a division of Sun Microsystems, Inc.