- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!Java サムネイルイメージの作成
[Java]{{category コード片}}
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
/**
* サムネイルJpegを生成する
* @author Yagi Hiroto
*/
public class ThumnailImageCreater {
/**
* InputSteramに関連付けられたイメージ
*
* @param in
* @param out
* @param formatName
* @param rate
* @throws IOException
* @throws ImageServiceException
*/
public void writeThumbNailImage(InputStream in,
OutputStream out,
String formatName,
double rate) throws Exception {
BufferedImage image = ImageIO.read(in);
writeThumbNailImage(out, image, formatName, rate);
}
/**
* @param in
* @param out
* @param rate
* @throws IOException
* @throws ImageServiceException
*/
public void writeThumbNailImage(InputStream in,
OutputStream out,
double rate) throws Exception {
writeThumbNailImage(in, out, "jpeg", rate);
}
/**
* @param in
* @param out
* @param width
* @param height
* @throws IOException
* @throws ImageServiceException
*/
public void writeThumbNailImage(InputStream in,
OutputStream out,
int width,
int height) throws Exception {
writeThumbNailImage(in, out, "jpeg", width, height);
}
/**
* @param in
* @param out
* @param formatName
* @param width
* @param height
* @throws IOException
* @throws ImageServiceException
*/
public void writeThumbNailImage(InputStream in,
OutputStream out,
String formatName,
int width,
int height) throws Exception {
BufferedImage image = ImageIO.read(in);
double rate = calcRatio(width, height, image);
writeThumbNailImage(out, image, formatName, rate);
}
/**
* 指定されたサイズに収まる縮小率を算出する
*
* @param width
* @param height
* @param image
* @return
*/
private double calcRatio(int width, int height, BufferedImage image) {
double wRate = (double) width / (double) image.getWidth();
double hRate = (double) height / (double) image.getHeight();
return (wRate < hRate) ? wRate : hRate;
}
/**
* @param out
* @param image
* @param formatName
* @param rate
* @throws IOException
* @throws ImageServiceException
*/
public void writeThumbNailImage( OutputStream out,
BufferedImage image,
String formatName,
double rate) throws Exception {
BufferedImage shrinkImage = new BufferedImage(
(int) (image.getWidth() * rate),
(int) (image.getHeight() * rate),
image.getType());
AffineTransformOp atOp = new AffineTransformOp(
AffineTransform.getScaleInstance(rate, rate), null);
atOp.filter(image, shrinkImage);
boolean ret = ImageIO.write(shrinkImage, formatName, out);
if (!ret) {
throw new Exception("writer not found.");
}
}
/**
* @param args
*/
public static void main(String[] args) {
if (args.length <= 3) {
printUsage();
}
FileInputStream in = null;
FileOutputStream out = null;
try {
String srcFilename = args[0].trim();
String dstFilename = args[1].trim();
if (srcFilename.equals(dstFilename)) {
System.out.println("ERROR : 変換前のファイル名と、変換後のファイル名が同じです");
}
int width = 0;
int height = 0;
double ratio = 0.0;
for (int i = 0; i < args.length; i++) {
if ("-w".equalsIgnoreCase(args[i].trim())) {
width = Integer.parseInt(args[i + 1]);
} else if ("-h".equalsIgnoreCase(args[i].trim())) {
height = Integer.parseInt(args[i + 1]);
} else if ("-r".equalsIgnoreCase(args[i].trim())) {
ratio = Double.parseDouble(args[i + 1]);
}
}
in = new FileInputStream(new File(srcFilename));
out = new FileOutputStream(new File(dstFilename));
ThumnailImageCreater me = new ThumnailImageCreater();
if (width > 0 || height > 0) {
me.writeThumbNailImage(in, out, width, height);
} else if (ratio > 0) {
me.writeThumbNailImage(in, out, ratio);
} else {
System.out.println("ERROR : サイズが指定されていません");
}
System.out.println("完了しました");
} catch (Exception e) {
e.printStackTrace();
printUsage();
} finally {
try {
if (in != null)
in.close();
if (out != null)
out.close();
} catch (Exception e) {
}
}
}
/**
*
*/
private static void printUsage() {
String usage = "usage ThumNailImage " + "originalfilename "
+ "shrinkfilename " + "[-w width]" + "[-h height]"
+ "[-r ratio]";
System.out.println(usage);
System.exit(0);
}
}