`
jiasongmao
  • 浏览: 648982 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

java制作图片的缩略图

阅读更多
package com.mxo9.b2c.service.administration.impl.goodstrading.goods;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class AlterUploadImage {
	String inputDir; //源图片的绝对路径,不包含图片的文件名
	String outputDir; //目标图片的绝对路径,不包含图片的文件名
	String inputFileName; //源图片文件名
	String outputFileName; //目标图片的文件名
	int outputWidth; //目标图片的宽
	int outputHeight; //目标图片的高
	boolean proportion = true; //是否等比例缩放
	private String inputFileUrl;//源图片的绝对路径,包含文件名
	private String outputFileUrl;//目标图片的绝对路径,包含文件名
	private String tempUrl;
	/**
	 * 初始化修改图片大小的参数
	 * @param inputDir 源图片的绝对路径,不包含图片的文件名
	 * @param outputDir 目标图片的绝对路径,不包含图片的文件名
	 * @param inputFileName 源图片文件名
	 * @param outputFileName 目标图片的文件名
	 * @param outputWidth 目标图片的宽
	 * @param outputHeight 目标图片的高
	 * @param proportion 是否等比例缩放
	 */
	public AlterUploadImage(String inputDir, String outputDir,
			String inputFileName, String outputFileName, int outputWidth,
			int outputHeight, boolean proportion) {
		this.inputDir=inputDir;
		this.outputDir=outputDir;
		this.inputFileName= inputFileName;
		this.outputFileName=outputFileName;
		this.outputWidth=outputWidth;
		this.outputHeight=outputHeight;
		this.proportion=proportion;
	}

	public AlterUploadImage() {
		inputDir="";
		outputDir="";
		inputFileName="";
		outputFileName="";
		outputWidth=100;
		outputHeight=100;
		proportion=true;
	}

	public boolean alterImageSize() throws IOException {
		//构造源、目标图片的路径
		inputFileUrl=inputDir+inputFileName;
		outputFileUrl=outputDir+outputFileName;
		createDir(outputDir);
		try { 
	        Image image = javax.imageio.ImageIO.read(new File(inputFileUrl)); 
	        int imageWidth = image.getWidth(null); 
	        int imageHeight = image.getHeight(null); 
	        float scale = getRatio(imageWidth,imageHeight,outputWidth,outputHeight); 
	        imageWidth = (int)(scale*imageWidth); 
	        imageHeight = (int)(scale*imageHeight); 
	         
	        image = image.getScaledInstance(imageWidth, imageHeight, Image.SCALE_AREA_AVERAGING); 
	        // Make a BufferedImage from the Image. 
	        BufferedImage mBufferedImage = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB); 
	        Graphics2D g2 = mBufferedImage.createGraphics();
	        g2.drawImage(image, 0, 0,imageWidth, imageHeight, Color.white,null); 
	        g2.dispose(); 
	         
	        float[] kernelData2 = {-0.125f,-0.125f,-0.125f,-0.125f,2,-0.125f,-0.125f,-0.125f,-0.125f}; 
	        Kernel kernel = new Kernel(3, 3, kernelData2); 
	        ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); 
	        mBufferedImage = cOp.filter(mBufferedImage, null); 

	        FileOutputStream out = new FileOutputStream(outputFileUrl);
	        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
	        encoder.encode(mBufferedImage); 
	        out.close(); 
	        return true;
	    }catch (Exception ioe){ 
	    	return false;
	    }
	    finally{
	    } 
		//return ThumbnailUtil.creatThumbnail(inputFileUrl, outputFileUrl, outputWidth, outputHeight);
//		File fileOut = new File(tempUrl);
//		File fileIn = new File(inputFileUrl);
//		FileOutputStream tempout = null;
//		try {
//			tempout = new FileOutputStream(fileOut);
//		} catch (Exception ex) {
//			System.out.println(ex.toString());
//		}
//		Image img = null;
//		Applet app = new Applet();
//		MediaTracker mt = new MediaTracker(app);
//		try {
//			img = javax.imageio.ImageIO.read(fileIn);
//			mt.addImage(img, 0);
//			mt.waitForID(0);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		if (img.getWidth(null) == -1) {
//			return false;
//		} 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());
//			}
//		}
//		createThumbImg(outputWidth,outputHeight);
//		fileOut.delete();
//		return true;
	}
	
	public static float getRatio(int width,int height,int maxWidth,int maxHeight){ 
	    float Ratio = 1.0f; 
	    float widthRatio ; 
	    float heightRatio ; 
	    widthRatio = (float)maxWidth/width; 
	    heightRatio = (float)maxHeight/height; 
	    if(widthRatio<1.0 || heightRatio<1.0){ 
	      Ratio = widthRatio<=heightRatio?widthRatio:heightRatio; 
	    } 
	    return Ratio; 
	  }
	
	//文亮,2009/07/15
	public boolean alterImageSizeForFriendLink() throws IOException {
		//构造源、目标图片的路径
		inputFileUrl=inputDir+inputFileName;
		outputFileUrl=outputDir+outputFileName;
		tempUrl=outputDir+outputFileName;
		createDir(tempUrl);
		File fileOut = new File(tempUrl);
		File fileIn = new File(inputFileUrl);
		FileOutputStream tempout = null;
		try {
			tempout = new FileOutputStream(fileOut);
		} catch (Exception ex) {
			System.out.println(ex.toString());
		}
		Image img = null;
		Applet app = new Applet();
		MediaTracker mt = new MediaTracker(app);
		try {
			img = javax.imageio.ImageIO.read(fileIn);
			mt.addImage(img, 0);
			mt.waitForID(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (img.getWidth(null) == -1) {
			return false;
		} 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 true;
	}
	
	//文亮,2009/07/15,图片批量处理
	public boolean alterImageSizeForPicBatch() throws IOException {
		//构造源、目标图片的路径
		inputFileUrl=inputDir+inputFileName;
		outputFileUrl=outputDir+outputFileName;
		tempUrl=outputDir+"temp"+outputFileName;
		createDir(tempUrl);
		File fileOut = new File(tempUrl);
		File fileIn = new File(inputFileUrl);
		FileOutputStream tempout = null;
		try {
				tempout = new FileOutputStream(fileOut);
		} catch (Exception ex) {
			System.out.println(ex.toString());
		}
		Image img = null;
		Applet app = new Applet();
		MediaTracker mt = new MediaTracker(app);
		try {
			img = javax.imageio.ImageIO.read(fileIn);
			mt.addImage(img, 0);
			mt.waitForID(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (img.getWidth(null) == -1) {
			return false;
		} 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());
			}
		}
		//createThumbImg(outputWidth,outputHeight);
		//fileOut.delete();
		return true;
	}
	
	/**
	 * 该方法用于对生成的图片进一步处理,处理的要求就是创建一个高度为参数outputHeight宽度为outputWidth的图像,其背景色为白色,然后将生成的图片放在该图像的中央
	 * 以创建一张新图片
	 * @param width 新图片的宽度
	 * @param height 新图片的高度
	 * @throws IOException
	 */
	public void createThumbImg(int width,int height) throws IOException{
		int startX=0;
		int startY=0;
		int[] ImageArrayOne=new int[width*height];
  	  	for(int i=0;i<ImageArrayOne.length;i++){
  	  		ImageArrayOne[i]=Color.WHITE.getRGB();
  	  	}
		//对第二张图片做相同的处理
        File fileTwo = new File(tempUrl);
        BufferedImage ImageTwo = ImageIO.read(fileTwo);
        int imgWidth = ImageTwo.getWidth();//图片宽度
        int imgHeight = ImageTwo.getHeight();//图片高度
        int[] ImageArray = new int[imgWidth*imgHeight];
        ImageArray = ImageTwo.getRGB(0,0,imgWidth,imgHeight,ImageArray,0,imgWidth);
		startX=(width-imgWidth)/2;
        startY=(height-imgHeight)/2;
        //生成新图片
        BufferedImage ImageNew = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        ImageNew.setRGB(0,0,width,height,ImageArrayOne,0,width);//设置背景色为白色
        ImageNew.setRGB(startX,startY,imgWidth,imgHeight,ImageArray,0,imgWidth);//将缩略图置于最上面
        File outFile = new File(outputFileUrl);
        ImageIO.write(ImageNew, outputFileUrl.substring(outputFileUrl.lastIndexOf(".")+1), outFile);//写图片
	}
	
	private void createDir(String path){
		String realPath;
		try{
			realPath=path.substring(0,path.lastIndexOf("/"));
		}
		catch(Exception e){
			realPath=path.substring(0,path.lastIndexOf("\\"));
		}
		File dir=new File(realPath);
		dir.mkdirs();
	}

	public String getInputDir() {
		return inputDir;
	}

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

	public String getOutputDir() {
		return outputDir;
	}

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

	public String getInputFileName() {
		return inputFileName;
	}

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

	public String getOutputFileName() {
		return outputFileName;
	}

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

	public int getOutputWidth() {
		return outputWidth;
	}

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

	public int getOutputHeight() {
		return outputHeight;
	}

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

	public boolean isProportion() {
		return proportion;
	}

	public void setProportion(boolean proportion) {
		this.proportion = proportion;
	}

	public String getInputFileUrl() {
		return inputFileUrl;
	}

	public void setInputFileUrl(String inputFileUrl) {
		this.inputFileUrl = inputFileUrl;
	}

	public String getOutputFileUrl() {
		return outputFileUrl;
	}

	public void setOutputFileUrl(String outputFileUrl) {
		this.outputFileUrl = outputFileUrl;
	}

}

 

分享到:
评论

相关推荐

    java结合gdal对大图片进行重采样

    java结合gdal对大图片进行重采样,代码主要功能为制作缩略图,可以对较大的图片进行压缩处理,解决java不能处理太大文件的问题

    从Java走向Java+EE+.rar

    6.3 实例——利用JSP制作图片缩略图 87 6.4 小结 90 第7章 JSTL——JSP标准标签库 91 7.1 JSTL基础 91 7.1.1 JSTL的核心标签库 92 7.1.2 JSTL中使用表达式语言 93 7.2 实例——利用JSTL标签生成数字序列...

    Joomla图片组件phocagallery-3.1简体中文包

    3、自动建立图片缩略图功能。 4、幻灯片(Slideshow)、分页(Pagination)、统计(Statistics)、评分(Rating) 等相册基本功能一应俱全。 5、具备水印(Watermark)功能,省去一一加入的繁琐动作,在制作缩略图时同时加入...

    java开源论坛jeebbs v5.1 源码包

    使用道具时可以通过支付宝和微信支付购买道具,我的消费记录,我的订单列表,主题收益统计,提现申请,提现申请列表 9、帖子图片上传后自动生成缩略图功能,点击缩略图查看大图 10、新增微信用户快速登录论坛功能...

    simpleimage-1.2.0-sources

    SimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。 SimpleImage中的ImageRender是图片处理的基类,它是一个抽象类,我们看到,该类中定义了一个抽象方法render(),同时持有一个对...

    java开源论坛jeebbs v5.1 安装包

    使用道具时可以通过支付宝和微信支付购买道具,我的消费记录,我的订单列表,主题收益统计,提现申请,提现申请列表 9、帖子图片上传后自动生成缩略图功能,点击缩略图查看大图 10、新增微信用户快速登录论坛功能...

    ExcelPanel Studio Demo

    ABBRIMAGE 缩略图 ADO OLE DB数据库 API Windows API封装 ASG AdvStringGrid CALLJAVA 调用Java的Class CLIPBOARD 剪贴板 COMMANDLINE 命令行 COMPONENT 组件封装 DATAEXPORT 数据导出向导和功能 DATAIMPORT 数据...

    JAlbum for Windows v15.0.zip

    软件最大的特色是,用户只需将文件夹中的图像和电影文件放入JAlbum ,然后该软件则会为你的图像创建一个缩略图,并将它们在一个HTML索引页中显示出来。另外,使用拖放操作来添加新的照片,或对其进行排序。创建...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    jsp编程的一些小技巧总结,绝对实用。包括JSP编程中常用的js技术。 1.JSP编程中常用的js技术 2. 在下拉列表框里选择一个值后跳出新窗口? 3. 在JSP中启动execl? 4. 两级下拉列表框联动菜单...121.上传图片并生成缩略图?

    javapms门户网站源码

    添加或修改文章时,可设置文档所属栏目、标题、外部链接、副标题、标题颜色、短标题、自动Tag标签、摘要、来源、来源链接、作者、文档类型、文档属性、推荐、置顶、缩略图、文档内容、内容显示模板、发布时间等,...

    jsp编程技巧集锦

    上传图片并生成缩略图? 122.JS实现图形菜单中点击当前图片变另一幅图片? 123.无刷新页面自动刷新? 124.写文件? 125.怎么得到鼠标点击在线图片的位置坐标? 126.页面单线程? 127.数字转中文 ...

    网管教程 从入门到精通软件篇.txt

    DWG:AutoCAD工程图文件;AutoCAD或Generic CADD老版本的绘图格式 DXR:Macromedia Director受保护(不可编辑)电影文件 E EDA:Ensoniq ASR磁盘映像 EDD:元素定义文档(FrameMaker+SGML文档) EDE:Ensoniq ...

    asp.net知识库

    鼠标放在一个连接上,会显示图片(类似tooltip) 使用microsoft.web.ui.webcontrols的TabStrip与IFame组件,达到页的切换效果 HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署...

Global site tag (gtag.js) - Google Analytics