java对图片进行缩略和得到视频的缩略图
来源:互联网 发布:在线培训考试系统源码 编辑:程序博客网 时间:2024/04/28 07:03
要求对大图和视频文件进行缩略 以方便列表 学习过后做了点小总结
对图片进行缩略的话网上现成的代码很多
我这里只尝试了其中一种
直接贴代码了
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*240cutpic.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的功能很强大 下面推荐几篇文章供大家可以深入参考
http://www.tuicool.com/articles/fMRRZvY javaWeb使用ffmpeg对视频转码和截图
http://www.360doc.com/content/15/0212/10/834950_448080831.shtml
听说javaCV也能做到对视频的截图 关于二者的性能比较 还请使用过的牛牛比较比较
0 0
- java对图片进行缩略和得到视频的缩略图
- 得到图片的缩略图
- 获取手机图片和视频的缩略图
- android获取图片和视频的缩略图
- android 获取视频和图片的缩略图
- android获取图片和视频的缩略图
- 获取视频和图片的缩略图
- java 对视频和图片进行加密解密
- 对BitMap进行缩略
- 获取图片缩略图和视频缩略图
- Android得到视频缩略图
- Android得到视频缩略图
- Android得到视频缩略图
- Android得到视频缩略图
- Android得到视频缩略图
- 获取Android手机的图片和视频的缩略图
- android 获取视频和图片的缩略图的方法
- java 读取图片的缩略图和dpi
- chomd指令用法
- HDU 5969 最大的位或
- 从数据类型开始吧!
- poj 1144 Network (tarjan求割点)
- c语言常用关键字 static,const,extern...
- java对图片进行缩略和得到视频的缩略图
- 文章标题
- 程序员简易成长指南:从菜鸟码农到架构师
- 使用自己的图标
- 不删除表数据重置自增id
- linux 添加 git ssh key
- C 链表记录学生信息
- 文章标题
- 将矩形图片绘制成圆形图片