JAVA生成缩略图

转载 2012年03月31日 11:21:14

本文来源于http://wing929.iteye.com/blog/185508,方法1中在原有的基础上增加了文件生成,及目录的生成,并且增加了以文件类型的参数的方法的重载,在服务器上传过程中可以用到。

 

方法1:[第一种方法比后一种生成的缩略图要清晰]

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.awt.*;
import java.awt.geom.AffineTransform;

import java.io.File;
import java.io.IOException;

public class ImageTest {
	public static BufferedImage resize(BufferedImage source, int targetW,
			int targetH) {
		// targetW,targetH分别表示目标长和宽
		int type = source.getType();
		BufferedImage target = null;
		double sx = (double) targetW / source.getWidth();
		double sy = (double) targetH / source.getHeight();
		// 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放
		// 则将下面的if else语句注释即可
		if (sx > sy) {
			sx = sy;
			targetW = (int) (sx * source.getWidth());
		} else {
			sy = sx;
			targetH = (int) (sy * source.getHeight());
		}
		if (type == BufferedImage.TYPE_CUSTOM) { // handmade
			ColorModel cm = source.getColorModel();
			WritableRaster raster = cm.createCompatibleWritableRaster(targetW,
					targetH);
			boolean alphaPremultiplied = cm.isAlphaPremultiplied();
			target = new BufferedImage(cm, raster, alphaPremultiplied, null);
		} else
			target = new BufferedImage(targetW, targetH, type);
		Graphics2D g = target.createGraphics();
		// smoother than exlax:
		g.setRenderingHint(RenderingHints.KEY_RENDERING,
				RenderingHints.VALUE_RENDER_QUALITY);
		g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
		g.dispose();
		return target;
	}

	/**
	 * @param fromFileStr
	 * @param saveToFileStr
	 * @param width 图片宽度
	 * @param hight 图片长度
	 * @throws Exception
	 */
	public static void saveImageAsJpg(String fromFileStr, String saveToFileStr,
			int width, int hight) throws Exception {
		BufferedImage srcImage;
		// String ex =
		// fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
		String imgType = "JPEG";
		if (fromFileStr.toLowerCase().endsWith(".png")) {
			imgType = "PNG";
		}
		// System.out.println(ex);
		File saveFile = new File(saveToFileStr);
		File fromFile = new File(fromFileStr);
		srcImage = ImageIO.read(fromFile);
		if (width > 0 || hight > 0) {
			srcImage = resize(srcImage, width, hight);
		}
		ImageIO.write(srcImage, imgType, saveFile);

	}
	
	/**
	 * 以JPG格式保存文件
	 * @param srcFile 原文件
	 * @param destFile 要保存到的文件
	 * @param width 图片宽度
	 * @param hight 图片长度
	 * @throws Exception
	 */
	public static void saveImageAsJpg(File srcFile, File destFile,
			int width, int hight) throws Exception {
		BufferedImage srcImage;
		String imgType = "JPEG";
		if (srcFile.getName().toLowerCase().endsWith(".png")) {
			imgType = "PNG";
		}
		srcImage = ImageIO.read(srcFile);
		if (width > 0 || hight > 0) {
			srcImage = resize(srcImage, width, hight);
		}
		ImageIO.write(srcImage, imgType, destFile);

	}

	public static void main(String argv[]) {
		try {
			// 参数1(from),参数2(to),参数3(宽),参数4(高)
//			ImageTest.saveImageAsJpg("E:/Document/My Pictures/3.gif",
//					"c:/6.gif", 50, 50);
			String fileName = "蓝.png";
			String srcFileName = "D:/20120201/"+fileName;
			String destFileName = "D:/TESTIMAGE/IMAGE/"+fileName;
			File srcFile = new File(srcFileName);
			File destFile = createFile(destFileName, "/");
			ImageTest.saveImageAsJpg(srcFile,destFile, 350, 350);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 生成文件路径以及文件
	 * @param path文件路径+文件名
	 * @param separate文件路径分隔标识,如/
	 * @return
	 */
	public static File createFile(String path, String separate) {
		createDir(path ,separate);
		File file = new File(path);
		try {
			if (file.exists()) {
				file.delete();
			}
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return file;
	}

	/**
	 * 生成文件目录
	 * @param path 如果传入的是目录,结尾必须以文件分隔符结尾
	 * @param separate
	 */
	public static void createDir(String path, String separate) {
		String filePath = path.substring(0, path.lastIndexOf(separate));
		File dir = new File(filePath);
		if (!dir.exists()) {
			createDir(filePath, separate);
			dir.mkdir();
		}
	}

}


 


 方法2:

 import java.io.*;
 import java.util.*;
 import com.sun.image.codec.jpeg.*;
 import java.awt.image.*;
 import java.awt.*;
 import java.net.*;
 import java.applet.*;
 import java.sql.*;

//缩略图类,
//本java类能将jpg图片文件,进行等比或非等比的大小转换。
//具体使用方法
//s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true))
 public class Tes {
 String InputDir; //输入图路径
 String OutputDir; //输出图路径
 String InputFileName; //输入图文件名
 String OutputFileName; //输出图文件名
 int OutputWidth = 80; //默认输出图片宽
 int OutputHeight = 80; //默认输出图片高
 int rate = 0;
 boolean proportion = true; //是否等比缩放标记(默认为等比缩放)

 public Tes() {
//初始化变量
 InputDir = "";
 OutputDir = "";
 InputFileName = "";
 OutputFileName = "";
 OutputWidth = 80;
 OutputHeight = 80;
 rate = 0;
 }

 public void setInputDir(String InputDir) {
 this.InputDir = InputDir;
 }

 public void setOutputDir(String OutputDir) {
 this.OutputDir = OutputDir;
 }

 public void setInputFileName(String InputFileName) {
 this.InputFileName = InputFileName;
 }

 public void setOutputFileName(String OutputFileName) {
 this.OutputFileName = OutputFileName;
 }

 public void setOutputWidth(int OutputWidth) {
 this.OutputWidth = OutputWidth;
 }

 public void setOutputHeight(int OutputHeight) {
 this.OutputHeight = OutputHeight;
 }

 public void setW_H(int width, int height) {
 this.OutputWidth = width;
 this.OutputHeight = height;
 }

 public String s_pic() {
 BufferedImage image;
 String NewFileName;
//建立输出文件对象
 File file = new File(OutputDir + OutputFileName);
 FileOutputStream tempout = null;
 try {
 tempout = new FileOutputStream(file);
 } catch (Exception ex) {
 System.out.println(ex.toString());
 }
 Image img = null;
 Toolkit tk = Toolkit.getDefaultToolkit();
 Applet app = new Applet();
 MediaTracker mt = new MediaTracker(app);
 try {
 img = tk.getImage(InputDir + InputFileName);
 mt.addImage(img, 0);
 mt.waitForID(0);
 } catch (Exception e) {
 e.printStackTrace();
 }

 if (img.getWidth(null) == -1) {
 System.out.println(" can't read,retry!" + "<BR>");
 return "no";
 } else {
 int new_w;
 int new_h;
 if (this.proportion == true) { //判断是否是等比缩放.
//为等比缩放计算输出的图片宽度及高度
 double rate1 = ((double) img.getWidth(null)) /
 (double) OutputWidth + 0.1;
 double rate2 = ((double) img.getHeight(null)) /
 (double) OutputHeight + 0.1;
 double rate = rate1 > rate2 ? rate1 : rate2;
 new_w = (int) (((double) img.getWidth(null)) / rate);
 new_h = (int) (((double) img.getHeight(null)) / rate);
 } else {
 new_w = OutputWidth; //输出的图片宽度
 new_h = OutputHeight; //输出的图片高度
 }
 BufferedImage buffImg = new BufferedImage(new_w, new_h,
 BufferedImage.TYPE_INT_RGB);

 Graphics g = buffImg.createGraphics();

 g.setColor(Color.white);
 g.fillRect(0, 0, new_w, new_h);

 g.drawImage(img, 0, 0, new_w, new_h, null);
 g.dispose();

 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
 try {
 encoder.encode(buffImg);
 tempout.close();
 } catch (IOException ex) {
 System.out.println(ex.toString());
 }
 }
 return "ok";
 }

 public String s_pic(String InputDir, String OutputDir, String InputFileName,
 String OutputFileName) {
//输入图路径
 this.InputDir = InputDir;
//输出图路径
 this.OutputDir = OutputDir;
//输入图文件名
 this.InputFileName = InputFileName;
//输出图文件名
 this.OutputFileName = OutputFileName;
 return s_pic();
 }

 public String s_pic(String InputDir, String OutputDir, String InputFileName,
 String OutputFileName, int width, int height,
 boolean gp) {
//输入图路径
 this.InputDir = InputDir;
//输出图路径
 this.OutputDir = OutputDir;
//输入图文件名
 this.InputFileName = InputFileName;
//输出图文件名
 this.OutputFileName = OutputFileName;
//设置图片长宽
 setW_H(width, height);
//是否是等比缩放 标记
 this.proportion = gp;
 return s_pic();
 }

 public static void main(String[] a) {
//s_pic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度)
 Tes mypic = new Tes();
 System.out.println(
 mypic.s_pic("E:\Document\My Pictures\",
 "E:\Document\My Pictures\",
 "topbg-3.gif", "3.gif", 400, 400, true)
 );

 }
 }


 

原文地址

http://wing929.iteye.com/blog/185508

java生成图片缩略图

当图片很大的时候,要生成预览图来提高网站响应速率,采用java的image相关类来生成缩略图 package com.liuc.core; import java.awt.Image; import...
  • shanhuhau
  • shanhuhau
  • 2013年12月30日 10:58
  • 1823

Java 视频生成缩略图教程

Java 视频生成缩略图教程  在网上找了好多相关的信息但是问题依旧没有解决今天在JavaEye网站上终于找到了 为了便于自己以后查找以及帮助遇到相同问题的朋友们写一篇教程  对于上传视频生成缩略图使...
  • fengda2870
  • fengda2870
  • 2009年06月29日 16:27
  • 7189

java实现生成缩略图

有时候我们为了让用户快速预览所有图片,在上传图片时同时生产缩略图。java可以使用Graphics2D绘制出缩略图。...
  • tianwei7518
  • tianwei7518
  • 2015年03月26日 21:06
  • 1659

Java中将word生成缩略图

解决思路是: 1、先将word生成pdf,这个采用openoffice或者jacob 2、然后将pdf生成图片 具体代码如下: private void officeToPdf(){ OpenOffi...
  • menghuannvxia
  • menghuannvxia
  • 2014年09月24日 13:30
  • 1512

java图片裁剪和java生成缩略图

一、缩略图在浏览相册的时候,可能需要生成相应的缩略图。 直接上代码:public class ImageUtil { private Logger log = LoggerFactory.ge...
  • u012385190
  • u012385190
  • 2017年01月10日 10:54
  • 3912

Java 自动生成缩略图片

一、自动生成缩略图方法: package writeimg; import java.awt.geom.AffineTransform; import java.awt.image.AffineT...
  • caoyuan10036
  • caoyuan10036
  • 2012年02月21日 10:49
  • 14852

java 生成pdf缩略图

项目中要使用PDF的缩略图,使用java几个开源项目来对pdf转换为图片的工作。 参照了文章:http://javasogo.iteye.com/blog/1169234  对比这几款开源项目PD...
  • helen_shw
  • helen_shw
  • 2012年06月26日 09:50
  • 3631

java生成上传图片的缩略图

# public class ToImg { # public static void main(String[] args) throws Exception { # ...
  • gundumw100
  • gundumw100
  • 2017年04月10日 17:35
  • 702

java写html缩略图

本人这几天想了好多方式!第一种:就是改html中所有的长度高度,等比例: 第二种:就是将html从后台转成图片: 第一种方法一定是可行的,不过实现起了通用性不大 第二种方法也是可行的:我现在就说说第二...
  • Love_5209
  • Love_5209
  • 2014年01月26日 14:58
  • 1489

Java生成视频缩略图

对于上传视频生成缩略图使用的是ffmpeg进行生成的。自己在网上找了如何进行编译ffmpeg的方法但是感觉太复杂了就到csdn上找到了编译好的ffmpeg文件下载下来给大家一个下载地址http://d...
  • cpp_lzth
  • cpp_lzth
  • 2010年09月15日 13:35
  • 7273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA生成缩略图
举报原因:
原因补充:

(最多只允许输入30个字)