⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagegenerator.java

📁 一个用struts tiles的在线影院web系统
💻 JAVA
字号:
package com.blue.imageio;

import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;

import com.blue.imageio.plugins.gif.GIFImageWriter;
import com.blue.imageio.plugins.gif.GIFImageWriterSpi;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.jimi.core.Jimi;
import com.sun.jimi.core.JimiException;

public class ImageGenerator {

	/**
	 * 生成缩略图
	 * @param sourcePath
	 * @param destPath
	 * @param size
	 * @throws ImageException
	 */
	public static void generateThumb(String sourcePath, String destPath, Size size) throws Exception, ImageException {
		generateImage(sourcePath, destPath, size);
	}
	/**
	 * 生成新图片
	 * @param sourcePath
	 * @param destPath
	 * @param size
	 * @throws ImageException
	 */
	public static void generateImage(String sourcePath, String destPath, Size size) throws Exception, ImageException {
		// read images. Here we read from files but it can be any source
		// (internet, database etc.)
		BufferedImage image = null;
		try {
			image = ImageIO.read(new FileInputStream(sourcePath));
		} catch (FileNotFoundException e) {
			throw new ImageException("Can not open source image file with filename : " + sourcePath);
		} catch (IOException e) {
			throw new ImageException("Error to read source image file.");
		}
		BufferedImage resultImage = ImageGenerator.cuteImage(image, size);
		try {
			// 其实生成图片不需要对png/jpg/bmp/gif分开处理,但为了能对细节进行调整,所以....
			if (destPath.toLowerCase().endsWith(".jpg")) {
				FileOutputStream fos = new FileOutputStream(destPath);
				JPEGEncodeParam param = JPEGCodec.getDefaultJPEGEncodeParam(resultImage);
				param.setQuality(0.99f, true);
				JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos, param);
				encoder.encode(resultImage);
				fos.close();
			} else if (destPath.toLowerCase().endsWith(".gif")) {
	            File iosFile = new File(destPath);
	            FileImageOutputStream fios = new FileImageOutputStream(iosFile);
				GIFImageWriterSpi gifSpi = new GIFImageWriterSpi();
				GIFImageWriter gifWriter = (GIFImageWriter)gifSpi.createWriterInstance();
				gifWriter.setOutput(fios);
				gifWriter.write(resultImage);
				fios.close();
			} else if (destPath.toLowerCase().endsWith(".png") || destPath.toLowerCase().endsWith(".bmp")) {
	        	// 缺省处理方式,未做细节调整
	        	Jimi.putImage(resultImage, destPath);
			} else {
				throw new ImageException("Unsupported image type for filename : " + destPath);
			}
		} catch (IOException e) {
			throw new ImageException("IOException while try to outout image file." + e.getMessage());
		} catch (JimiException e) {
			throw new ImageException("JimiException. " + e.getMessage());
		}
	}
	/**
	 * 图片裁剪
	 * @param imgOrigin
	 * @param newSize
	 * @return
	 * @throws ImageException
	 */
	public static BufferedImage cuteImage(BufferedImage imgOrigin, Size newSize) throws Exception, ImageException {
		Size size = new Size(imgOrigin.getWidth(), imgOrigin.getHeight());

		// Get ratio of height / width for both source and destination images.
		double s_ratio = (double) size.getWidth() / (double) size.getHeight();
		double n_ratio = (double) newSize.getWidth() / (double) newSize.getHeight();

		// Calc cuted image size.
		int x, y, width, height;
		if (s_ratio < n_ratio) {
			width = size.getWidth();
			height = (int)((double)size.getWidth() / n_ratio);
		} else {
			width = (int) ((double)size.getHeight() * n_ratio);
			height = size.getHeight();
		}
		double ratio = (double)newSize.getWidth() / (double)width;
		x = (int)(((imgOrigin.getWidth() - width) / 2) * ratio);
		y = (int)(((imgOrigin.getHeight() - height) / 2) * ratio);
		System.out.println("============ cuteImage =============");
		System.out.println("x=" + x);
		System.out.println("y=" + y);
		System.out.println("width=" + width);
		System.out.println("height=" + height);
		System.out.println("ratio=" + ratio);

		return resizeImage(imgOrigin, ratio, x, y, /*width*/newSize.getWidth(), /*height*/newSize.getHeight());
	}
	
	/**
	 * 图片尺寸缩放
	 * @param imageOrigin
	 * @param ratio
	 * @param x
	 * @param y
	 * @param width
	 * @param height
	 * @return
	 * @throws ImageException
	 */
	public static BufferedImage resizeImage(BufferedImage imageOrigin,
			double ratio, int x, int y, int width, int height) throws Exception, ImageException {
		BufferedImage bi = new BufferedImage((int) ((double) imageOrigin.getWidth() * ratio),
				(int) ((double) imageOrigin.getHeight() * ratio),
				BufferedImage.TYPE_INT_RGB);

		AffineTransform transform = AffineTransform.getScaleInstance(ratio, ratio);
		bi.createGraphics().drawImage(imageOrigin, transform, null);
		System.out.println("TRACE: bi.width=" + bi.getWidth());
		System.out.println("TRACE: bi.height=" + bi.getHeight());
		System.out.println("TRACE: x=" + x);
		System.out.println("TRACE: y=" + y);
		System.out.println("TRACE: width=" + width);
		System.out.println("TRACE: height=" + height);

		// 消除缩放比例类型转换可能带来的误差。
		if ((x + width) > bi.getWidth())	width = bi.getWidth() - x;
		if ((y + height > bi.getHeight()))	height = bi.getHeight() - y;
		return bi.getSubimage(x, y, width, height);
	}
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			generateThumb("c:\\1.jpg", "c:\\2.png", new Size(100, 100));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -