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
原创粉丝点击