java 图片缩略图的两种方法

   最近网上看到两种不同的java图片缩略图的绘制方案

 

    第一种,使用Graphics().drawImage按照一定的比例重新绘制图像。

 

package com.image.suoluetu;

import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;

public class DrawImage {
	private String destFile;
	private int width;
	private int height;
	private Image img;

	public DrawImage(String fileName) throws IOException {
		File _file = new File(fileName); // 读入文件
		_file.getName();
		this.destFile = "D:/dage2.jpg";// this.srcFile.substring(0,
										// this.srcFile.lastIndexOf("."))
										// +"_s.jpg";
		img = javax.imageio.ImageIO.read(_file); // 构造Image对象
		width = img.getWidth(null); // 得到源图宽
		height = img.getHeight(null); // 得到源图长
	}

	/**
	 * /**
	 * 
	 * @param args
	 */
	public void resize(int w, int h) throws IOException {
		try {
			BufferedImage _image = new BufferedImage(w, h,
					BufferedImage.TYPE_INT_RGB);
			_image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图
			FileOutputStream newimageout = new FileOutputStream(destFile); // 输出到文件流
			/*
			 * JPEGImageEncoder 将图像缓冲数据编码为 JPEG 数据流。该接口的用户应在 Raster 或
			 * BufferedImage 中提供图像数据,在 JPEGEncodeParams 对象中设置必要的参数, 并成功地打开
			 * OutputStream(编码 JPEG 流的目的流)。JPEGImageEncoder 接口可 将图像数据编码为互换的缩略
			 * JPEG 数据流,该数据流将写入提供给编码器的 OutputStream 中。
			 * 注意:com.sun.image.codec.jpeg 包中的类并不属于核心 Java API。它们属于 Sun 发布的 JDK
			 * 和 JRE 产品的组成部分。虽然其它获得许可方可能选择发布这些类,但开发人员不能寄 希望于从非 Sun
			 * 实现的软件中得到它们。我们期望相同的功能最终可以在核心 API 或标准扩 展中得到。
			 */
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimageout);
			encoder.encode(_image); // 近JPEG编码
			newimageout.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 按照固定的比例缩放图片
	 * 
	 * @param t
	 *            double 比例
	 * @throws IOException
	 */
	public void resize(double t) throws IOException {
		int w = (int) (width * t);
		int h = (int) (height * t);
		resize(w, h);
	}

	/**
	 * 以宽度为基准,等比例放缩图片
	 * 
	 * @param w
	 *            int 新宽度
	 * @throws IOException
	 */
	public void resizeByWidth(int w) throws IOException {
		int h = (int) (height * w / width);
		resize(w, h);
	}

	/**
	 * 以高度为基准,等比例缩放图片
	 * 
	 * @param h
	 *            int 新高度
	 * @throws IOException
	 */
	public void resizeByHeight(int h) throws IOException {
		int w = (int) (width * h / height);
		resize(w, h);
	}

	/**
	 * 按照最大高度限制,生成最大的等比例缩略图
	 * 
	 * @param w
	 *            int 最大宽度
	 * @param h
	 *            int 最大高度
	 * @throws IOException
	 */
	public void resizeFix(int w, int h) throws IOException {
		if (width / height > w / h) {
			resizeByWidth(w);
		} else {
			resizeByHeight(h);
		}
	}

	/**
	 * 设置目标文件名 setDestFile
	 * 
	 * @param fileName
	 *            String 文件名字符串
	 */
	public void setDestFile(String fileName) throws Exception {
		if (!fileName.endsWith(".jpg")) {
			throw new Exception("Dest File Must end with \".jpg\".");
		}
		destFile = fileName;
	}

	/**
	 * 获取目标文件名 getDestFile
	 */
	public String getDestFile() {
		return destFile;
	}

	/**
	 * 获取图片原始宽度 getSrcWidth
	 */
	public int getSrcWidth() {
		return width;
	}

	/**
	 * 获取图片原始高度 getSrcHeight
	 */
	public int getSrcHeight() {
		return height;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			DrawImage ccc = new DrawImage("D:/dage.jpg");
			ccc.resizeFix(600, 400);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 第二种:使用仿射转换的技术进行图片绘制。

 

package com.image.suoluetu;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;

public class AffineTransImage {

	public static void main (String argv[]) {
		try {
			File fi = new File("D:/dage.jpg"); //大图文件
			File fo = new File("D:/dagex.jpg"); //将要转换出的小图文件
			int nw = 500;
			/*
			AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D
			坐标的线性映射,保留了线的“直线性”和“平行性”。可以使用一系
			列平移、缩放、翻转、旋转和剪切来构造仿射变换。
			*/
			AffineTransform transform = new AffineTransform();
			BufferedImage bis = ImageIO.read(fi); //读取图片
			int w = bis.getWidth();
			int h = bis.getHeight();
			 //double scale = (double)w/h;
			int nh = (nw*h)/w ;
			double sx = (double)nw/w;
			double sy = (double)nh/h;
			transform.setToScale(sx,sy); //setToScale(double sx, double sy) 将此变换设置为缩放变换。
			System.out.println(w + " " +h);
			/*
			 * AffineTransformOp类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或
			 *  Raster 中 2D 坐标的线性映射。所使用的插值类型由构造方法通过
			 *  一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
			如果在构造方法中指定了 RenderingHints 对象,则使用插值提示和呈现
			的质量提示为此操作设置插值类型。要求进行颜色转换时,可以使用颜色
			呈现提示和抖动提示。 注意,务必要满足以下约束:源图像与目标图像
			必须不同。 对于 Raster 对象,源图像中的 band 数必须等于目标图像中
			的 band 数。
			*/
			AffineTransformOp ato = new AffineTransformOp(transform,null);
			BufferedImage bid = new BufferedImage(nw,nh,BufferedImage.TYPE_3BYTE_BGR);
			/*
			 * TYPE_3BYTE_BGR 表示一个具有 8 位 RGB 颜色分量的图像,
			 * 对应于 Windows 风格的 BGR 颜色模型,具有用 3 字节存
			 * 储的 Blue、Green 和 Red 三种颜色。
			*/
			ato.filter(bis,bid);
			ImageIO.write(bid,"jpeg",fo);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

你可能感兴趣的:(java)