`

java制作图片的缩略图

    博客分类:
  • 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 ImageJ 支持图片格式转换,图片放大缩小等,功能非常强大,缩略图高清晰,有实例代码

    提供的`Thumbnail_Maker.java`是一个具体的代码示例,展示了如何使用ImageJ进行缩略图的制作。通过分析和运行这个示例,开发者可以快速上手ImageJ的使用。 6. **开发应用**: 利用ImageJ,开发者不仅可以进行基本...

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

    在这种情况下,我们可以借助外部库,如GDAL(Geospatial Data Abstraction Library),来扩展Java的能力,实现大图片的重采样和压缩,从而制作缩略图。以下是对这个主题的详细阐述: **GDAL介绍** GDAL是一个开源的...

    图片剪切、生成缩略图、图片合成、图片加密校验

    本项目涉及的核心知识点包括图片剪切、生成缩略图、图片合成以及图片的MD5加密和校验,这些都是图像处理的重要组成部分。下面将详细讲解这些技术。 1. **图片剪切**: 图片剪切是指从原始图片中选取特定区域,将...

    用java做的图片浏览器

    7. **多线程**:如果图片浏览器需要支持预览或缩略图功能,可能需要在后台线程中加载大图片,以避免阻塞用户界面。Java的Thread类或ExecutorService接口可以用来实现这一目标。 8. **异常处理**:在处理文件和图像...

    生成缩略图并加水印文字源码

    生成缩略图的过程通常涉及图像处理库,如PHP中的GD库或Imagick,Python中的PIL(Python Imaging Library)或OpenCV,Java中的Java Advanced Imaging (JAI) 或 ImageIO等。这些库提供了函数来读取图像、调整尺寸并...

    Java实现的不同图片居中剪裁生成同一尺寸缩略图功能示例

    以下是一个具体的Java实现,用于将不同尺寸的图片居中剪裁成指定大小的缩略图。 首先,我们需要引入相关的Java库,特别是`java.awt`和`javax.imageio`包,它们包含了处理图像所需的基本类。例如,`BufferedImage`...

    制作图片浏览器

    综上所述,制作图片浏览器不仅仅是编写代码显示图片那么简单,还需要综合运用图像处理、用户界面设计、文件系统操作、多线程编程、性能优化等多方面的知识。只有充分理解和掌握这些技术,才能构建出高效、易用且功能...

    上传缩略图与地区三级联动

    2. 服务器端处理:用户上传原始图片后,服务器端通过编程语言(如PHP、Python、Java)的图像处理库(如GD库、ImageMagick)进行缩略图生成。这种方法更稳定,不受客户端限制,但会增加服务器计算资源的消耗。 接...

    简单易懂的图片水印缩略

    "简单易懂的图片水印缩略"这个主题涉及到两个关键概念:图片水印和图片缩略。接下来,我们将深入探讨这两个概念及其相关的技术实现。 首先,我们来谈谈图片水印。水印是一种将版权信息或标识添加到图片上的技术,它...

    java实现电子阅读器(源代码)

    实现这一功能需要生成每个页面的缩略图,可能需要用到 ImageIO 类进行图片读取和处理,以及 Thumbnailator 这样的第三方库来创建缩略图。缩位图数据同样需要存储和加载,以便于用户浏览。 综上所述,这个 Java 实现...

    用JAVA实现的幻灯片小程序

    同时,通过阅读和理解"slider.java"的代码,开发者可以进一步定制功能,比如添加过渡效果、增加图片缩略图预览或者实现更复杂的交互操作。对于初学者而言,这是一个很好的学习项目,可以帮助他们提升Java编程和图形...

    JMagick图片处理

    这个技术涵盖了多个关键知识点,包括创建缩略图、添加水印、切图以及压缩图片,这些都是数字图像处理中的基本操作。 首先,**缩略图**的生成是通过调整原图像尺寸,生成较小的版本,常用于网站预览或者节省存储空间...

    用JAI扩展Java的图像处理能力 - 中文JAVA技术网

    4. **网络图像服务**:在网络应用中,JAI可以用于动态生成缩略图、调整图像质量等。 五、JAI与其他图像库的比较 相比于Java标准库中的`java.awt.image`包,JAI提供了更强大的功能和更好的性能。与第三方库如OpenCV...

    电子图片公告牌

    如果是动态生成,可能涉及服务器端的图像处理库(如ImageMagick或GD库),用于缩略图的生成和尺寸调整。同时,需要考虑CDN(内容分发网络)服务,提高图片加载速度和用户体验。 5. **安全措施**:考虑到网络安全,...

    从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)功能,省去一一加入的繁琐动作,在制作缩略图时同时加入...

    博浪图片上传留言程序

    同时,还可能对图片进行压缩、重命名或生成缩略图,以节省存储空间和提高加载速度。 其次,留言功能是此程序的核心交互部分。它需要一个数据库来存储用户的留言信息,如用户名、留言内容、图片ID等。数据库设计应...

    图片浏览器

    1. **图片预览**:用户应能快速预览图片,通常通过缩略图展示,点击后可以放大查看全图。 2. **图片滑动**:支持平滑的图片切换,用户可以通过左右滑动浏览前后图片。 3. **图片旋转**:支持图片90度、180度和270度...

    java Img转视频的Jim2mov以及JMF、thumbnailator-0.4.8

    "thumbnailator-0.4.8"则是一个Java库,专门用于创建图像缩略图。它提供了简单易用的API,可以快速地从图像文件生成缩略图,并且支持多种调整选项,如尺寸、质量、裁剪等。这个库在处理大量图像时非常有用,特别是在...

    图片文件上传

    6. **缩略图生成**:为了优化显示和节省存储空间,可能需要生成图片的缩略图。 7. **数据库交互**:将文件信息(如文件名、路径、上传时间等)存储在数据库中,方便后续访问和管理。 8. **错误处理**:提供清晰的...

Global site tag (gtag.js) - Google Analytics