Java 压缩图片并打包成ZIP文件的示例

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

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

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

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的资料请关注我们其它相关文章!

(0)

相关推荐

  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    1.情景展示 在调用腾讯身份证OCR接口的时候,由于要求图片大小只能限制在1MB以内,这样,就必须使用到图片压缩技术 2.代码展示 /**  * 图片处理工具类  * @explain  * @author Marydon  * @creationTime 2019年9月3日上午10:14:17  * @version 1.0  * @since  * @email marydon20170307@163.com  */ public class ImgUtils {     /**      

  • Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】

    本文实例讲述了Java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.Fil

  • 详解Java中使用ImageIO类对图片进行压缩的方法

    最近做项目需要图片压缩处理,网上找的方法大都使用了 com.sun.image.codec.jpeg.* 这个包中的JPEGImageEncoder类,引入这个包后一直报错,各种google百度,尝试了各种方法,包括手动引jre中的rt.jar,以及在eclipse中把受访问限制的API提示从ERROR改为WARNING,等等,然而这些都是不好使的,因为后来我发现我的java-7-openjdk-amd64中的rt.jar里边根本就没有com.sun.image.*,貌似这个类在java7中已经

  • java对图片进行压缩和resize缩放的方法

    序 这里展示一下如何对图片进行压缩和resize.分享给大家,具体如下: 压缩 public static boolean compress(String src,String to, float quality) { boolean rs = true; // Build param JPEGEncodeParam param = null; // Build encoder File destination = new File(to); FileOutputStream os = null

  • Java 实现图片压缩的两种方法

    问题背景. 典型的情景:Nemo社区中,用户上传的图片免不了要在某处给用户做展示. 如用户上传的头像,那么其他用户在浏览该用户信息的时候,就会需要回显头像信息了. 用户上传的原图可能由于清晰度较高而体积也相对较大,考虑用户流量带宽,一般而言我们都不会直接体积巨大的原图直接丢给用户让用户慢慢下载. 这时候通常我们会在服务器对图片进行压缩,然后把压缩后的图片内容回显给用户. 压缩方案: 这里主要找了两个java中常用的图片压缩工具库:Graphics和Thumbnailator. 1.Graphic

  • java压缩文件和下载图片示例

    本文实例为大家分享了java压缩文件和下载图片示例,供大家参考,具体内容如下 主页面index.xml <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html> <head> <title>项目的主页</title> </head> <body> <h2>主页

  • 解决java压缩图片透明背景变黑色的问题

    复制代码 代码如下: public class Picture {          // TODO Auto-generated constructor stub       public static void resizePNG(String fromFile, String toFile, int outputWidth, int outputHeight,boolean proportion) {              try {                 File f2 =

  • java多线程实现下载图片并压缩

    最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下载4000个左右的图片,然后压缩,下面把我的实现方式和优化过程记录下来,如果大家有什么更好的方式可以分享. 使用框架:SpringMVC 定时任务实现:继承org.springframework.scheduling.quartz.QuartzJobBean; ftp环境搭建就不说了,在其他博客记录

  • java实现文件上传下载和图片压缩代码示例

    分享一个在项目中用的到文件上传下载和对图片的压缩,直接从项目中扒出来的:) 复制代码 代码如下: package com.eabax.plugin.yundada.utils; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.

  • 使用Java生成jpg与压缩图片为jpg文件的代码示例

    Java生成jpg格式图片: package other.pic; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; import java.awt.imag

  • java实现上传图片并压缩图片大小功能

    Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量.还支持对一个目录的所有图片进行批量处理操作. 支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例. 另外值得一提的是,Thumbnailator至今仍不断更新,怎么样,感觉很有保障吧! 下面我们介绍下如何使用Thu

  • Java 使用Thumbnails对大图片压缩

    引言 在最近的项目开发中,经常会使用到图片上传,但是过大的图片在查看的时候会影响打开速度,浪费流量以及服务器存储空间,所以需要在后端处理完图片再上传,这里我们用到了Thumbnails图片处理工具类. Thumbnails主要支持以下一些功能 1.指定大小进行缩放 2.按照比例进行缩放 3.不按照比例,指定大小进行缩放 4.旋转 5.水印 6.裁剪 7.转化图片格式 8.输出到OutputStream 9.输出到BufferedImage 使用步骤: 一.添加Maven <dependency>

  • java input 调用手机相机和本地照片上传图片到服务器然后压缩的方法

    在微信公众号里面需要上传头像,时间比较紧,调用学习jssdk并使用 来不及 就用了input 1.使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能 <input type="file" accept="image/*" capture="camera"> <input type="file" accept="video/*&q

随机推荐