`

转:使用Java生成缩略图

阅读更多

生成缩略图的代码主要来源于:http://www.cnblogs.com/digdeep/p/4829471.html

有根据自己的业务进行封装,基本业务如下:图片上传之后,根据图片的原始宽度和系统设定的缩略图最大宽度计算出一个缩放比例,再根据这个比例计算缩略图的高度,最后在同目录下重绘出缩略图。

具体代码如下:

public class ThumImgUtil {
	private static int maxW = 0;//缩略图最大的宽度,此值只作参考
	private static double point = 0;//计算出比例之后,添加富余的百分比
	private static String postfix="_2";//缩略图的名称:原图的名称+_2+.+后缀名
	//该方法用来生成缩略图
	/**
     * 按指定高度 等比例缩放图片
     * 
     * @param imageFile
     * @param newPath
     * @throws IOException
     */
    public  void zoomImageScale(File imageFile){
    	try{
	    	if(!imageFile.canRead()) return;
	        BufferedImage bufferedImage = ImageIO.read(imageFile);
	        if (null == bufferedImage) return;
	        
	        int originalWidth = bufferedImage.getWidth();
	        int originalHeight = bufferedImage.getHeight();
	        
	        //获取缩略图的路径
	        String originalPath = imageFile.getAbsolutePath();
			String thumPath = (originalPath.substring(0,originalPath.lastIndexOf(".")))+postfix+(originalPath.substring(originalPath.lastIndexOf(".")));
	        /*
	        //根据原始宽度获取缩放后的宽度
	        int newWidth = getImgNewWidth(originalWidth);
	        System.out.println("新的宽度:"+newWidth);
	        double scale = (double)originalWidth / (double)newWidth;    // 缩放的比例
	        
	        int newHeight =  (int)(originalHeight / scale);
	        */
	        //计算新的高度和宽度
	        double scale = getImgScale(originalWidth);
	        if(scale==1){//为1,说明按照原图生成缩略图,也就是复制一张图
	        	System.out.println("复制图片,路径为:"+originalPath);
	        	FileUtils.copyFile(new File(originalPath),new File(thumPath));
	        }else{//按照要求生成一张
		        int newWidth =  (int)(originalWidth*scale);
		        int newHeight =  (int)(originalHeight*scale);
		        
				//System.out.println("原始路径:"+originalPath+"\n缩略图路径:"+(name+postfix+extName));
		        zoomImageUtils(imageFile,thumPath, bufferedImage,newWidth,newHeight);
	        }
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    }
    
    private void zoomImageUtils(File imageFile, String newPath, BufferedImage bufferedImage, int width, int height){
		 String suffix = StringUtils.substringAfterLast(imageFile.getName(), ".");
		 try{
			 // 处理 png 背景变黑的问题
			if(suffix != null && (suffix.trim().toLowerCase().endsWith("png") || suffix.trim().toLowerCase().endsWith("gif"))){
			    BufferedImage to= new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
			    Graphics2D g2d = to.createGraphics(); 
			    to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); 
			    g2d.dispose(); 
			    
			    g2d = to.createGraphics(); 
			    Image from = bufferedImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING); 
			    g2d.drawImage(from, 0, 0, null);
			    g2d.dispose(); 
			    
			    ImageIO.write(to, suffix, new File(newPath));
			}else{
			    /*
				//高质量压缩,其实对清晰度而言没有太多的帮助
			    BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			    tag.getGraphics().drawImage(bufferedImage, 0, 0, width, height, null);
			
			    FileOutputStream out = new FileOutputStream(newPath);    // 将图片写入 newPath
			    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			    JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
			    jep.setQuality(1f, true);    //压缩质量, 1 是最高值
			    encoder.encode(tag, jep);
			    out.close();
			    */
			    
			    BufferedImage newImage = new BufferedImage(width, height, bufferedImage.getType());
			    Graphics g = newImage.getGraphics();
			    g.drawImage(bufferedImage, 0, 0, width, height, null);
			    g.dispose();
			    ImageIO.write(newImage, suffix, new File(newPath));
			}
		 }catch(Exception e){
			 e.printStackTrace();
		 }
    }
    
    /**
     * 该方法根据原始图片的宽度/高度获取新的宽度/高度
     * 原则:不得少于400,取与400最近的值
     * @param originalWidth:原始宽度
     * **/
    public int getImgNewWidth(int originalWidth){
    	initMaxWidth();//初始化最大宽度和富余值
    	//如果小于maxW,返回原始值
    	if(originalWidth<=maxW){return originalWidth;}
    	
    	double scale = Math.ceil(maxW/originalWidth)+point;//向上取整
    	return (int) (maxW*scale);
    }
    
    /**
     * 该方法根据原始图片的宽度/高度获取适合的比例
     * 原则:不得少于400,取与500最近的值
     * @param originalWidth:原始宽度
     * **/
    public double getImgScale(int originalWidth){
    	initMaxWidth();//初始化最大宽度和富余值
    	//如果小于maxW,直接返回1
    	if(originalWidth<=maxW){return 1;}
    	double scale = (double)maxW/originalWidth;
    	scale = scale+ point;
    	return Double.parseDouble(new DecimalFormat("0.00").format(scale));//保留2位小数
    }
    
    //该方法用来初始化最大的宽度和富余百分比
    public void initMaxWidth(){
    	if(maxW<=0){//缩略图最大宽度
    		if(WebAppConfig.app("maxW")!=null && WebAppConfig.app("maxW").trim().length()>0){
    			try{
    				maxW = Integer.parseInt(WebAppConfig.app("maxW"));
    			}catch(Exception e){
    				maxW = 400;
    				e.printStackTrace();
    			}
    	    }else maxW = 400;
    	}
    	
    	if(point<=0){//计算出比例之后,添加两个富余的百分比
    		if(WebAppConfig.app("point")!=null && WebAppConfig.app("point").trim().length()>0){
    			try{
    				point = Double.parseDouble(WebAppConfig.app("point"));
    			}catch(Exception e){
    				point = 0.02;
    				e.printStackTrace();
    			}
    	    }else point = 0.02;
    	}
    }
    
    /**
     * 该方法用来将指定目录下的所有jpeg,jpg格式的图片查找出来,并生成缩略图
     * @param dic:需要生成缩略图的目录或文件
     * **/
    public void createThumImg(String dic){
    	File originalFile = new File(dic);
    	if(!isDir(dic)){//是个文件
    		//判断这个文件是否存在
    		if(originalFile.exists()){//存在,生成缩略图
    			String filePath = originalFile.getAbsolutePath();
    			//判断是不是jpg,jpeg,png的格式,若是进行处理
    			String extName = filePath.substring(filePath.lastIndexOf(".")+1).toLowerCase();
    			if(extName.endsWith("jpg") || extName.endsWith("jpeg") || extName.endsWith("png")){
    				System.out.println("文件目录:"+filePath);
    				zoomImageScale(new File(filePath));
    			}
    		}
    	}else{//是个目录,循环出下面的所有文件
    		File[] files = originalFile.listFiles();
    		for(int i=0;i<files.length;i++){
    			createThumImg(files[i].getAbsolutePath());
    		}
    	}
    }
    
    /**
	 * 该方法用来判断给定的字符串是不是文件夹
	 * @param filePath:可能是文件夹,也可能是文件
	 * @return boolean :true:文件夹 false:文件
	 * **/
	public static boolean isDir(String filePath){
		boolean result = false;
		//获取最后一个/的后面部分
		filePath = filePath.substring(filePath.lastIndexOf("/") + 1); // 在这里可以记录用户和文件信息
		
		//判断是否有.若没有,说明是文件夹,否则是文件(也可能是带有.的文件夹,此处不处理)
		if(filePath.indexOf(".")!=-1){//说明
			result = false;
		}else{//没有,是文件夹
			result=true;
		}
		return result;
	}
}

配置文件webApp.properties

maxW=400
point=0.02

(PS:因为缩略图是在手机上看的,所以maxW设置比较小)

 

读取配置文件的代码

public final class WebAppConfig { 
	/** 
     * 私有构造方法,不能创建对象 
     */ 
    private WebAppConfig() {} 
	/***
	 * 
	 * @param key:properties文件中各个选项的name值
	 * @return String:与name值对应的value值
	 */
	public static String app(String key){
		String value=null;
        if(key!=null && key.trim().length()>0){
        	Properties prop = new Properties(); 
            //读取指定的文件
        	InputStream in = WebAppConfig.class.getResourceAsStream("/webApp.properties"); 
            try { 
                prop.load(in); 
                value = prop.getProperty(key).trim(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            }
        }
        return value;
    }
	
	public static void main(String[] args){
		String savePath = app("businessFilePath");
		System.out.println(savePath);
	}
}

希望对大家所有帮助。

分享到:
评论

相关推荐

    java 图片生成缩略图

    在本文中,我们将介绍使用Java生成缩略图的方法。 缩略图生成方法 在 Java 中,生成缩略图可以使用多种方法,本文将介绍两种常见的方法。 方法一:使用BufferedImage类 使用BufferedImage类可以实现图片的缩略图...

    java 上传图片生成缩略图

    ### Java 上传图片生成缩略图的知识点解析 在现代Web开发中,处理图像是一项常见的需求,尤其是在涉及用户上传图片的应用场景中。本篇文章将基于提供的代码片段详细讲解如何使用Java来实现上传图片并自动生成缩略图...

    java生成缩略图类(已经封装好)

    java 生成缩略图类 源代码 (已经封装好)

    java生成缩略图

    根据提供的文件信息,我们可以总结出以下关于“Java生成缩略图”的相关知识点: ### Java生成缩略图基础知识 #### 缩略图的概念 缩略图是原始图像的一个较小版本,通常用于网页展示、图片预览等场景。通过生成缩略...

    java视频生成图片(缩略图)-实例-(指定时间)

    6. **Java bindings for FFmpeg:** 如果不希望通过命令行接口,还可以使用Java对FFmpeg的绑定库,如JAVE(Java Audio Video Encoder),它提供了一个友好的API来执行FFmpeg的任务,包括生成缩略图。 7. **处理步骤...

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

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

    java 生成缩略图

    例如,使用Commons Imaging生成缩略图: ```java import org.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.ImageWriteException; import org.apache.commons.imaging.Imaging; ...

    java生成图片缩略图和二进制文件的工具类

    将图片生成缩略图和转换为二进制的工具类,缩略图大小可调

    java上传图片,处理图片,word转pdf图片缩略图生成

    java上传图片,处理图片,word转pdf图片缩略图生成,替换所有图片的ip地址工具类

    java生成缩略图的方法示例

    Java 生成缩略图是指使用 Java 语言生成缩略图的过程,这个过程中涉及到各种图形处理技巧。下面将详细介绍 Java 生成缩略图的方法示例。 图像处理基础 在 Java 中,图像处理是通过使用 BufferedImage 类来实现的。...

    java生成缩略图.pdf

    在Java中生成缩略图是一项常见的任务,尤其是在开发Web应用或者需要处理用户上传图片的系统中。这个过程涉及对原始图像进行重新尺寸调整,以创建一个较小的版本,通常用于预览或节省存储空间。在提供的代码片段中,...

    java生成缩略图.zip

    在这个"java生成缩略图.zip"压缩包中,我们可能找到了一份Java源代码,用于演示如何在Java环境下创建图像的缩略图。 首先,我们要了解在Java中生成缩略图的关键概念和技术。Java的`java.awt.image`和`javax.imageio...

    JAVA获取视频缩略图

    以`xuggle-xuggler`为例,你可以通过以下步骤获取视频缩略图: 1. 添加依赖:在Maven或Gradle配置文件中添加`xuggle-xuggler`的依赖。 2. 初始化:创建一个`IMediaReader`对象,指定要读取的视频文件路径。 3. 设置...

    基于Springmvc的上传图片并生成缩略图

    生成缩略图通常可以借助于图像处理库,如Java的`javax.imageio.ImageIO`或第三方库如Apache Commons Imaging。以下是一个简单的示例: ```java try { BufferedImage originalImage = ImageIO.read(file....

    JSP上传图片并生成缩略图

    在这个特定的场景中,"JSP上传图片并生成缩略图"是一个常见的功能需求,尤其是在开发包含用户交互和多媒体内容的Web应用时。下面我们将详细探讨这一技术实现的关键知识点。 首先,**上传组件**是Web应用中用于接收...

    pdfbox,生成pdf文件的缩略图

    在实际应用中,你可能需要对整个PDF文档的所有页面生成缩略图,并将它们保存在一个集合或目录中,以便在用户界面中展示。同时,为了提高性能,可以考虑使用多线程处理多个PDF文件的缩略图生成。 总结来说,PDFBox...

    java批量上传图片并生成缩略图

    总之,实现"java批量上传图片并生成缩略图"的功能,需要结合Java的Servlet技术处理文件上传,使用图像处理库生成缩略图,并且在前后端之间进行有效的通信。这不仅是技术上的挑战,也是对系统设计和优化能力的考验。

    java缩略图代码

    这个 Java 类实现了基本的图片处理功能,包括网络图片的下载、屏幕截图和生成缩略图。实际开发中,可能还需要考虑异常处理、多线程下载、图片格式转换等更多复杂情况。此外,由于 Sun Microsystems 的 `com.sun` 包...

    生成缩略图

    java 生成缩略图 java 生成缩略图 java 生成缩略图java 生成缩略图java 生成缩略图

    java图片生成缩略图

    /** * 压缩图片方法 * * @param oldFile 将要压缩的图片 * @param width 压缩宽 * @param height 压缩高 * @param quality 压缩清晰度 建议为1.0 * @param smallIcon 压缩图片后,添加的扩展名(在图片后缀名...

Global site tag (gtag.js) - Google Analytics