要求对大图和视频文件进行缩略 以方便列表 学习过后做了点小总结 


对图片进行缩略的话网上现成的代码很多

我这里只尝试了其中一种

直接贴代码了

public class PicHelper
{

	

	/**
	 * <p>Title: ImageUtil </p>
	 * <p>Description: </p>
	 * <p>Email: icerainsoft@hotmail.com </p> 
	 * @author Ares
	 * @date 2014年10月28日 上午10:24:26
	 */
	

	  
	    private static Logger log = LoggerFactory.getLogger(PicHelper.class);
	    
	    private static String DEFAULT_THUMB_PREVFIX = "thumb_";
	    private static String DEFAULT_CUT_PREVFIX = "cut_";
	    private static Boolean DEFAULT_FORCE = false;
	    
	    
	    /**
	     * <p>Title: cutImage</p>
	     * <p>Description:  根据原图与裁切size截取局部图片</p>
	     * @param srcImg    源图片
	     * @param output    图片输出流
	     * @param rect        需要截取部分的坐标和大小
	     */
	    public void cutImage(File srcImg, OutputStream output, java.awt.Rectangle rect){
	        if(srcImg.exists()){
	            java.io.FileInputStream fis = null;
	            ImageInputStream iis = null;
	            try {
	                fis = new FileInputStream(srcImg);
	                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
	                String types = Arrays.toString(ImageIO.getReaderFormatNames()).replace("]", ",");
	                String suffix = null;
	                // 获取图片后缀
	                if(srcImg.getName().indexOf(".") > -1) {
	                    suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
	                }// 类型和图片后缀全部小写,然后判断后缀是否合法
	                if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()+",") < 0){
	                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
	                    return ;
	                }
	                // 将FileInputStream 转换为ImageInputStream
	                iis = ImageIO.createImageInputStream(fis);
	                // 根据图片类型获取该种类型的ImageReader
	                ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next();
	                reader.setInput(iis,true);
	                ImageReadParam param = reader.getDefaultReadParam();
	                param.setSourceRegion(rect);
	                BufferedImage bi = reader.read(0, param);
	                ImageIO.write(bi, suffix, output);
	            } catch (FileNotFoundException e) {
	                e.printStackTrace();
	            } catch (IOException e) {
	                e.printStackTrace();
	            } finally {
	                try {
	                    if(fis != null) fis.close();
	                    if(iis != null) iis.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	        }else {
	            log.warn("the src image is not exist.");
	        }
	    }
	    
	    public void cutImage(File srcImg, OutputStream output, int x, int y, int width, int height){
	        cutImage(srcImg, output, new java.awt.Rectangle(x, y, width, height));
	    }
	    
	    public void cutImage(File srcImg, String destImgPath, java.awt.Rectangle rect){
	        File destImg = new File(destImgPath);
	        if(destImg.exists()){
	            String p = destImg.getPath();
	            try {
	                if(!destImg.isDirectory()) p = destImg.getParent();
	                if(!p.endsWith(File.separator)) p = p + File.separator;
	                cutImage(srcImg, new java.io.FileOutputStream(p + DEFAULT_CUT_PREVFIX + "_" + new java.util.Date().getTime() + "_" + srcImg.getName()), rect);
	            } catch (FileNotFoundException e) {
	                log.warn("the dest image is not exist.");
	            }
	        }else log.warn("the dest image folder is not exist.");
	    }
	    
	    public void cutImage(File srcImg, String destImg, int x, int y, int width, int height){
	        cutImage(srcImg, destImg, new java.awt.Rectangle(x, y, width, height));
	    }
	    
	    public void cutImage(String srcImg, String destImg, int x, int y, int width, int height){
	        cutImage(new File(srcImg), destImg, new java.awt.Rectangle(x, y, width, height));
	    }
	    /**
	     * <p>Title: thumbnailImage</p>
	     * <p>Description: 根据图片路径生成缩略图 </p>
	     * @param imagePath    原图片路径
	     * @param w            缩略图宽
	     * @param h            缩略图高
	     * @param prevfix    生成缩略图的前缀
	     * @param force        是否强制按照宽高生成缩略图(如果为false,则生成最佳比例缩略图)
	     * return 缩略图的文件名
	     */
	    public static String thumbnailImage(File srcImg, FileOutputStream output, int w, int h, String prevfix, boolean force){
	        if(srcImg.exists()){
	            try {
	                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
	                String types = Arrays.toString(ImageIO.getReaderFormatNames()).replace("]", ",");
	                String suffix = null;
	                // 获取图片后缀
	                if(srcImg.getName().indexOf(".") > -1) {
	                    suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
	                }// 类型和图片后缀全部小写,然后判断后缀是否合法
	                if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()+",") < 0){
	                    log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
	                    return null;
	                }
	                log.debug("target image's size, width:{}, height:{}.",w,h);
	                Image img = ImageIO.read(srcImg);
	                // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
	                if(!force){
	                    int width = img.getWidth(null);
	                    int height = img.getHeight(null);
	                    if((width*1.0)/w < (height*1.0)/h){
	                        if(width > w){
	                            h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));
	                            log.debug("change image's height, width:{}, height:{}.",w,h);
	                        }
	                    } else {
	                        if(height > h){
	                            w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));
	                            log.debug("change image's width, width:{}, height:{}.",w,h);
	                        }
	                    }
	                }
	                BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
	                Graphics g = bi.getGraphics();
	                g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
	                g.dispose();
	                // 将图片保存在原目录并加上前缀
	                ImageIO.write(bi, suffix, output);
	                output.close();
	               
	            } catch (IOException e) {
	               log.error("generate thumbnail image failed.",e);
	               return null;
	            }
	        }else{
	            log.warn("the src image is not exist.");
	        }
			return DEFAULT_THUMB_PREVFIX+srcImg.getName();
	    }
	    public static String thumbnailImage(File srcImg, String destination,int w, int h, String prevfix, boolean force){
	        String p = srcImg.getAbsolutePath();
	        try {
	            if(!srcImg.isDirectory()) p = srcImg.getParent();
	            if(!p.endsWith(File.separator)) p = p + File.separator;
	            return  thumbnailImage(srcImg, new java.io.FileOutputStream(destination + prevfix +srcImg.getName()), w, h, prevfix, force);
	        } catch (FileNotFoundException e) {
	            log.error("the dest image is not exist.",e);
	        }
			return null;
	    }
	    
	 
	    
	    public static String thumbnailImage(String imagePath,String destination, int w, int h, boolean force){
	    	  File srcImg = new File(imagePath);
	    	return thumbnailImage(srcImg,destination, w, h, DEFAULT_THUMB_PREVFIX, DEFAULT_FORCE);
	    }
	    
	    public static String thumbnailImage(String imagePath,String destination, int w, int h){
	    	File dfile = new File(destination);
	    	if(!dfile.exists()){
	    		dfile.mkdirs();
	    	}
	        return thumbnailImage(imagePath,destination+"/", w, h, DEFAULT_FORCE);
	    }
	    
	    public static void main(String[] args) {
	        System.out.println(new PicHelper().thumbnailImage("C:\\Users\\zhengzechao\\Desktop\\1.png", "d:",150, 100));
	        
	    //    new PicHelper().cutImage("imgs/Tulips.jpg","imgs", 250, 70, 300, 400);
	    }
	    
	    

	

}




对视频的转码的话比较复杂 也说不上复杂  只是作者本身走了点歪路 

使用了ffmpeg的支持

ffmpeg的官网下载地址如下

https://ffmpeg.zeranoe.com/builds/

建议下载对应自己系统的static压缩包 即可免编译使用 如果想深入学习的话 可以下载源代码

下载完以后压缩并在环境变量里Path下配置ffmpeg.exe的bin目录

cmd下输入ffmpeg -version显示了版本信息则说明安装成功 可以使用了 

使用代码很简单

下面只贴出作者自己的测试缩略图的代码

public static void handler(String ffmpegPath,String upFilePath,String mediaPicPath){
		  List<String> cutpic = new ArrayList<String>();
			cutpic.add(ffmpegPath);
			cutpic.add("-i");
			cutpic.add(upFilePath); // 同上(指定的文件即可以是转换为flv格式之前的文件,也可以是转换的flv文件)
			cutpic.add("-y");
			cutpic.add("-f");
			cutpic.add("image2");
			cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间
			cutpic.add("0"); // 添加起始时间为第17秒
			cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间
			cutpic.add("0.001"); // 添加持续时间为1毫秒
			cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小
			cutpic.add("500*400"); // 添加截取的图片大小为350*240
			cutpic.add(mediaPicPath); // 添加截取的图片的保存路径

			boolean mark = true;
			ProcessBuilder builder = new ProcessBuilder();
			try {
			   
			    builder.command(cutpic);
			    builder.redirectErrorStream(true);
			    // 如果此属性为 true,则任何由通过此对象的 start() 方法启动的后续子进程生成的错误输出都将与标准输出合并,
			    //因此两者均可使用 Process.getInputStream() 方法读取。这使得关联错误消息和相应的输出变得更容易
			    builder.start();
			} catch (Exception e) {
			    mark = false;
			    System.out.println(e);
			    e.printStackTrace();
			}
	  }
	
		  
	   public static void main(String[] args){
		   handler("D:\\迅雷下载\\ffmpeg-20161104-b4e9252-win64-static\\bin\\ffmpeg.exe","D:\\迅雷下载\\黑马\\29 Linux系统挂载操作mount详细使用\\29 Linux系统挂载操作mount详细使用.wmv","d:\\uu.jpg");
	   }



当然ffmpeg的功能很强大 下面推荐几篇文章供大家可以深入参考


听说javaCV也能做到对视频的截图 关于二者的性能比较 还请使用过的牛牛比较比较