`
frank1998819
  • 浏览: 730953 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

Java 压缩图片并打成ZIP(转)

    博客分类:
  • Java
 
阅读更多

引用

  JAVA 获取网络图片或本地图片压缩后打成ZIP,但是获取网络流存在问题:每次获取图片流的大小不一样(图片不完整),以致无法构建图片进行压缩?

Java代码  收藏代码

    /*
    释以下代码:即可获取完整图片流网络不稳定情况且网络流是顺序读取,所以获得前部份流,不需要关闭连接,只需要将用完的流关闭即可
    */ 
    finally{ 
        if(httpCon != null) 
        httpCon.disconnect(); 
    } 


Java代码  收藏代码

    package com.sunshine.monitor.comm.util.http; 
     
    import java.io.File; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.net.HttpURLConnection; 
    import java.net.URL; 
    import java.net.URLConnection; 
    import java.util.Iterator; 
     
    import javax.imageio.ImageIO; 
    import javax.imageio.ImageReader; 
    import javax.imageio.stream.ImageInputStream; 
     
    import sun.net.www.protocol.ftp.FtpURLConnection; 
     
    /**
     * 获取网络图片
     * 
     * @author OY
     */ 
    public abstract class HttpHelpers { 
     
        private static final String KEY = "file.encoding"; 
     
        private static final String ENCODING = "GBK"; 
     
        public static InputStream getInputStream(String url) throws Exception{ 
            URLConnection con = null; 
            HttpURLConnection httpCon = null; 
            FtpURLConnection ftpCon= null; 
            try { 
                System.setProperty(KEY, ENCODING); 
                URL _url = new URL(url); 
                con = _url.openConnection(); 
                con.setConnectTimeout(3000); 
                con.setUseCaches(false);// 不缓存 
                con.setDefaultUseCaches(false); 
                if (con instanceof HttpURLConnection) { 
                    httpCon = (HttpURLConnection) con; 
                    httpCon.setInstanceFollowRedirects(true); 
                    //httpCon.setRequestProperty("Accept-Charset", "utf-8"); 
                    if (httpCon.getResponseCode() >= 300) { 
                        System.out.println("URL:" + url 
                                + ",HTTP Request is not success, Response code is " 
                                + httpCon.getResponseCode()); 
                    } else { 
                        return httpCon.getInputStream(); 
                    } 
                } else if(con instanceof FtpURLConnection){ 
                    ftpCon = (FtpURLConnection)con; 
                    return ftpCon.getInputStream(); 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            }finally{ 
                if(httpCon != null) 
                    httpCon.disconnect(); 
            } 
            return null; 
        } 
         
        public static void main(String[] args) { 
            // 1图片本地存储大小 
            OutputStream fout = null; 
            InputStream input = null; 
            try { 
                fout = new FileOutputStream("F:" + File.separator + "1.jpg"); 
                input = getInputStream("http://192.168.1.200/t.jpg"); 
                byte[] buffer = new byte[1024]; 
                int count = 0 ; 
                while((count=input.read(buffer)) != -1){ 
                    fout.write(buffer, 0, count); 
                } 
                fout.flush(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally{ 
                try { 
                    if(input != null) input.close(); 
                    if(fout != null) fout.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
             
            // 2是否可以构建图片 
            try { 
                input = getInputStream("http://192.168.1.200/t.jpg"); 
                ImageInputStream iis = ImageIO.createImageInputStream(input); 
                if(iis != null) { 
                    Iterator<ImageReader> it = ImageIO.getImageReaders(iis); 
                    if(!it.hasNext()){ 
                        System.out.println("流不完整或不是图片!"); 
                    } else { 
                        System.out.println(it.next().getFormatName()); 
                    } 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
    } 



引用

图片压缩采用thumbnailator,可以按大小、按比例、按质量压缩并增加水印,API简单

Java代码  收藏代码

     package com.sunshine.monitor.comm.util.compress; 
     
    import java.io.ByteArrayInputStream; 
    import java.io.ByteArrayOutputStream; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
     
    import javax.imageio.ImageIO; 
     
    import net.coobird.thumbnailator.Thumbnails; 
    import net.coobird.thumbnailator.geometry.Positions; 
     
    /**
     * 图片压缩:按大小、按比例压缩、按质量
     * 增加水印
     * @author OY
     * 
     */ 
    public abstract class CompressPictureTools { 
     
        private static float QUALITY = 0.6f; 
         
        /**
         * 按大小缩小
         * 
         * @param file
         * @param width
         * @param height
         * @return
         * @throws Exception
         */ 
        public static byte[] compressOfSize(File file, int width, int height) 
                throws Exception { 
            byte[] bs = null; 
            InputStream input = null; 
            try { 
                input = new FileInputStream(file); 
                bs = compressOfSize(input, width, height); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return bs; 
        } 
     
        /**
         * 按大小缩小
         * 
         * @param input 原图
         * @param width 目标宽席
         * @param height 目标高度
         * @return
         * @throws Exception
         */ 
        public static byte[] compressOfSize(InputStream input, int width, int height) 
                throws Exception { 
            ByteArrayOutputStream output = null; 
            try { 
                output = new ByteArrayOutputStream(); 
                Thumbnails.of(input).size(width, height).toOutputStream(output); 
                return output.toByteArray(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (output != null) 
                        output.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return null; 
        } 
     
        /**
         * 按指定比例进行缩小和放大: percent=1不变 percent>1放大 percent<1缩小
         * 
         * @param input 原图
         * @param percent 压缩比例
         * @return
         * @throws Exception
         */ 
        public static byte[] compressOfPercent(InputStream input, float percent) 
                throws Exception { 
            ByteArrayOutputStream output = null; 
            try { 
                output = new ByteArrayOutputStream(); 
                Thumbnails.of(input).scale(percent).toOutputStream(output); 
                return output.toByteArray(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (output != null) 
                        output.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return null; 
        } 
     
        /**
         * 按指定比例进行缩小和放大: percent=1不变 percent>1放大 percent<1缩小
         * 
         * @param file 原图
         * @param percent 压缩比例
         */ 
        public static byte[] compressOfPercent(File file, float percent) 
                throws Exception { 
            byte[] bs = null; 
            InputStream input = null; 
            try { 
                input = new FileInputStream(file); 
                bs = compressOfPercent(input, percent); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return bs; 
        } 
     
        /**
         * 按质量压缩:图片尺寸不变,压缩图片文件大小
         * 
         * @param file 原图
         * @param quality
         *            =1为最高质量
         * @return
         * @throws Exception
         */ 
        public static byte[] compressOfQuality(File file, float quality) 
                throws Exception { 
            byte[] bs = null; 
            InputStream input = null; 
            try { 
                input = new FileInputStream(file); 
                bs = compressOfQuality(input, quality); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return bs; 
        } 
     
        /**
         * 按质量压缩:图片尺寸不变,压缩图片文件大小
         * 
         * @param input 原图
         * @param quality
         *            =1为最高质量
         * @return
         * @throws Exception
         */ 
        public static byte[] compressOfQuality(InputStream input, float quality) 
                throws Exception { 
            ByteArrayOutputStream output = null; 
            try { 
                output = new ByteArrayOutputStream(); 
                if(quality == 0){ 
                    Thumbnails.of(input).scale(1f).outputQuality(QUALITY) 
                    .toOutputStream(output); 
                } else { 
                    Thumbnails.of(input).scale(1f).outputQuality(quality) 
                        .toOutputStream(output); 
                } 
                return output.toByteArray(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (output != null) 
                        output.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return null; 
        } 
     
        /**
         * 图片右下角添加水印
         * 
         * @param fromPic
         *            原图
         * @param markPic
         *            水印图
         * @param transparent
         *            透明度
         * @return
         * @throws Exception
         */ 
        public static byte[] waterMark(byte[] fromPic, InputStream markPic, 
                float transparent) throws Exception { 
            InputStream finput = null; 
            ByteArrayOutputStream output = null; 
            try { 
                finput = new ByteArrayInputStream(fromPic); 
                output = new ByteArrayOutputStream(); 
                Thumbnails 
                        .of(finput) 
                        .scale(1f) 
                        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(markPic), 
                                transparent).toOutputStream(output); 
                return output.toByteArray(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (output != null) 
                        output.close(); 
                    if (finput != null) 
                        finput.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return null; 
        } 
     
        /**
         * 图片格式转换
         * 
         * @param fromPic
         *            原图
         * @param picFormat
         *            格式 png,jpg...
         * @return
         * @throws Exception
         */ 
        public static byte[] transferPicFormat(byte[] fromPic, String picFormat) 
                throws Exception { 
            ByteArrayInputStream finput = null; 
            ByteArrayOutputStream output = null; 
            try { 
                finput = new ByteArrayInputStream(fromPic); 
                output = new ByteArrayOutputStream(); 
                Thumbnails.of(finput).outputFormat(picFormat) 
                        .toOutputStream(output); 
                return output.toByteArray(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (output != null) 
                        output.close(); 
                    if (finput != null) 
                        finput.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            return null; 
        } 
    } 


引用

因JDK1.7以下,不可以设置编码,以致中文乱码问题,未采用java.util.ZipOutputStream,而是Apache ant下的ZipOutputStream

Java代码  收藏代码

    package com.sunshine.monitor.comm.util.compress; 
     
    import java.io.BufferedInputStream; 
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 
    import java.util.Arrays; 
    import java.util.Collections; 
    import java.util.Iterator; 
    import java.util.List; 
    import java.util.Map; 
    import java.util.Map.Entry; 
    import java.util.Set; 
     
    import org.apache.tools.zip.ZipEntry; 
    import org.apache.tools.zip.ZipOutputStream; 
     
    import com.sunshine.monitor.comm.util.http.HttpHelpers; 
    /**
     * 图片压缩成ZIP,支持并发多线程;
     * java.util.ZipOutputStream中文乱码 
     * 方法一、JDK1.7可以设置编码 
     * 方法二、换成Apache ant
     * @author OY
     * 
     */ 
    public class PicturePackZipTools { 
     
    private static String DEFAULT_COMPRESS_ENCODE = "GBK"; 
         
        private static ZipOutputStream getZipStreamEncode(OutputStream output, 
                String encode) { 
            ZipOutputStream zipStream = new ZipOutputStream(output); 
            if (encode == null || "".equals(encode)) { 
                zipStream.setEncoding(DEFAULT_COMPRESS_ENCODE); 
            } else { 
                zipStream.setEncoding(encode); 
            } 
            return zipStream; 
        } 
     
        /**
         * 访问本地路径下的所有文件
         * 
         * @param path
         * @return
         */ 
        public static List<File> loadFiles(String path) { 
            List<File> list = null; 
            try { 
                File fold = new File(path); 
                if (fold.isDirectory()) { 
                    File[] files = fold.listFiles(); 
                    list = Arrays.asList(files); 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return list; 
        } 
     
        /**
         * 读取本地系统路径下的所有图片打成ZIP
         * 
         * @param path
         * @param output
         * @param compress
         */ 
        public static void compressZip(String path, OutputStream output, 
                String encode, boolean compress) { 
            List<File> listfiles = null; 
            ZipOutputStream zipStream = null; 
            try { 
                zipStream = getZipStreamEncode(output, encode); 
                listfiles = loadFiles(path); 
                for (File file : listfiles) { 
                    compressZip(file, zipStream, compress); 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (zipStream != null) { 
                        zipStream.close(); 
                    } 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /**
         * 读取网络图片打成打成ZIP
         * @param urls
         *            key = 图片名, value = 图片URL
         * @param output 
         * @param encode 编码
         * @param compress 是否压缩
         */ 
        public static void compressZip(Map<String, String> urls, 
                OutputStream output, String encode, boolean compress) { 
            ZipOutputStream zipStream = null; 
            try { 
                zipStream = getZipStreamEncode(output, encode); 
                Map<String, String> synUrls = Collections.synchronizedMap(urls); 
                Set<Entry<String, String>> set = synUrls.entrySet(); 
                Iterator<Entry<String, String>> it = set.iterator(); 
                while (it.hasNext()) { 
                    Entry<String, String> entry = it.next(); 
                    compressZip(entry.getValue(), zipStream, entry.getKey(), 
                            compress); 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (zipStream != null) { 
                        zipStream.close(); 
                    } 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /**
         * 压缩单个文件为ZIP
         * @param file
         * @param output
         * @param encode
         * @param compress
         */ 
        public static void compressZip(File file, OutputStream output, 
                String encode, boolean compress) throws Exception{ 
            FileInputStream input = null; 
            try { 
                input = new FileInputStream(file); 
                compressZip(input,file.getName(),output,encode,compress); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            }  finally { 
                try { 
                    if (input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
             
        } 
     
        /**
         * 压缩单个文件为ZIP
         * @param input
         * @param fileName
         * @param output
         * @param encode
         * @param compress
         */ 
        public static void compressZip(InputStream input, String fileName, 
                OutputStream output, String encode, boolean compress) throws Exception { 
            ZipOutputStream zipStream = null; 
            try { 
                zipStream = getZipStreamEncode(output, encode); 
                zip(input, zipStream, fileName, compress); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (zipStream != null) 
                        zipStream.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /**
         * 本地图片
         */ 
        private static void compressZip(File file, ZipOutputStream zipStream, 
                boolean compress) throws Exception{ 
            FileInputStream input = null; 
            try { 
                input = new FileInputStream(file); 
                zip(input, zipStream, file.getName(), compress); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            }finally{ 
                try { 
                    if(input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /**
         * 网络图片
         * 
         * @param url
         * @param zipStream
         * @param compress
         */ 
        private static void compressZip(String url, ZipOutputStream zipStream, 
                String fileName, boolean compress) throws Exception{ 
            InputStream input = null; 
            try { 
                input = HttpHelpers.getInputStream(url); 
                zip(input, zipStream, fileName, compress); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally{ 
                try { 
                    if(input != null) 
                        input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /**
         * @param input
         * @param zipStream
         * @param zipEntryName
         * @param compress
         */ 
        private static void zip(InputStream input, ZipOutputStream zipStream, 
                String zipEntryName, boolean compress) throws Exception{ 
            byte[] bytes = null; 
            BufferedInputStream bufferStream = null; 
            try { 
                if(input == null) 
                    throw new Exception("获取压缩的数据项失败! 数据项名为:" + zipEntryName); 
                // 压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样 
                ZipEntry zipEntry = new ZipEntry(zipEntryName); 
                // 定位到该压缩条目位置,开始写入文件到压缩包中 
                zipStream.putNextEntry(zipEntry); 
                if (compress) { 
                    bytes = CompressPictureTools.compressOfQuality(input, 0); 
                    zipStream.write(bytes, 0, bytes.length); 
                } else { 
                    bytes = new byte[1024 * 5];// 读写缓冲区 
                    bufferStream = new BufferedInputStream(input);// 输入缓冲流 
                    int read = 0; 
                    while ((read = bufferStream.read(bytes)) != -1) { 
                        zipStream.write(bytes, 0, read); 
                    } 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } finally { 
                try { 
                    if (null != bufferStream) 
                        bufferStream.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
    } 

 

分享到:
评论

相关推荐

    java后台批量下载文件并压缩成zip下载的方法

    主要为大家详细介绍了java后台批量下载文件并压缩成zip下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java多个文件根据URL下载后打包zip导出.zip

    Java根据Url把多个文件下载到指定的文件夹目录,然后再将文件夹目录打包成zip导出,包括子目录也可以打包,有个简单的导出html页面,点击导出按钮下载zip。

    java动态导出excel压缩成zip下载的方法

    主要为大家详细介绍了java动态导出excel压缩成zip下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java实现批量下载 多文件打包成zip格式下载

    主要为大家详细介绍了java实现批量下载、将多文件打包成zip格式下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    PDF压缩软件实现自由控制压缩文档大小.zip

    我们用PDF shrink把同一文件分别采用四种不同的设置模式压缩下来得到的结果对比,可以看出web格式的压缩率最大,但是打开浏览的显示效果最差(对于图片类PDF,压缩率和显示效果清晰度成反比。 建议大家如果要打印的...

    JAVA上百实例源码以及开源项目源代码

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    JAVA上百实例源码以及开源项目

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包---java 源码 大量 实例

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包4

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包3

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包2

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    Java案例开发锦集

    案例7 烟花汇演 案例8 星空模拟 案例9 阴影跑马灯 案例10 下雪的图片 案例11 动态分割线 案例12 飞流直下 第三章 XML与其他 案例1 将HTML文件转成XML文件 案例2 将XML文件转换成可...

    JAVA 范例大全 光盘 资源

    实例89 Zip格式压缩、解压缩文件 228 实例90 从Jar中读取文本 232 实例91 流标记分割和统计字符串 234 实例92 Java操作Excel文件 237 第11章 Java高级特性 245 实例93 自动装箱与拆箱 245 实例94 for/in循环 ...

    java中如何打jar包jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。

    好了,不用管他是怎么压缩的,我们的重点是哪些是我们要压缩的(输入),还有压缩成了什么(输出),进而将它发布(部 署)。  那我们的输入(要压缩的东西)主要是class文件,还有辅助的资源(这其中可能有图片,jsp文件...

    新版Android开发教程.rar

    程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形...

Global site tag (gtag.js) - Google Analytics