常用的图片操作(保存图片 & 获得字节流 & 大小转换 & 压缩等等)

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.xiaoleilu.hutool.util.ZipUtil;
import javafx.scene.shape.Path;
import org.apache.commons.io.FileUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author: jiangjiabin
 * @date: 2019/1/17
 */
public class TestsApplication {

    public static void main(String[] args) throws IOException {

        System.out.println("start.....");
        String url = "http://img13.360buyimg.com/n1/jfs/t1/23782/15/2182/146014/5c1a1106Efd17752a/bb86a6aa9ef459c2.jpg";
        String localpath = "C:\\Users\\jiangjiabin\\Desktop\\nice.jpg";
        String mainDir = "D:" + File.separator + "picture";
        String fileName = "D:" + File.separator + "picture" + File.separator + "pic" + System.currentTimeMillis() + ".jpg";
        String newName = "D:" + File.separator + "picture" + File.separator + "newPic" + System.currentTimeMillis() + ".jpg";

//test4
        byte[] bytes = getImageFromLocalByUrl(localpath);
        writeImageToDisk(bytes, fileName);

        resizeImage(fileName, newName, 1000, "jpg");


//test3
//        byte[] bytes = getImageFromLocalByUrl(localpath);
//        writeImageToDisk(bytes, fileName);
//        ZipUtil.zip(fileName);

//        changeSize(fileName, newName, "jpg", 2, true);

//test2
//        byte[] imageBytes = getImageFromNetByUrl(url);
//        writeImageToDisk(imageBytes, fileName);

//test 1
//        readImgToLocal(url, mainDir + File.separator + "finished", "img.png");
//        //通过zip工具包压缩
//        ZipUtil.zip(mainDir);
//        System.out.println("end.....");

    }

    /**
     * 通过url保存图片
     *
     * @param srcPath   图片url
     * @param directory 保存到本地的目录
     * @param fileName  文件名
     */
    private static void readImgToLocal(String srcPath, String directory, String fileName) {

        URL source;
        try {
            source = new URL(srcPath);
            File destination = FileUtils.getFile(directory, fileName);
            FileUtils.copyURLToFile(source, destination);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据地址获得数据的字节流
     *
     * @param strUrl 网络连接地址
     * @return
     */
    public static byte[] getImageFromNetByUrl(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            InputStream inStream = conn.getInputStream();// 通过输入流获取图片数据
            byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 从输入流中获取数据
     *
     * @param inStream 输入流
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[10240];
        int len;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }

    /**
     * 将图片写入到磁盘
     *
     * @param img      图片数据流
     * @param fileName 文件保存时的路径及名字名称,  可以这样指定路径: fileName = "D:" + File.separator + "图片集" + File.separator + "pic.jpg"
     */
    public static void writeImageToDisk(byte[] img, String fileName) {
        try {
            File file = new File(fileName);
            if (!file.exists()) {
                File files = new File(file.getParent());
                files.mkdirs();
                file.createNewFile();
            }
            FileOutputStream fops = new FileOutputStream(file);
            fops.write(img);
            fops.flush();
            fops.close();
            System.out.println("图片已经写入" + fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据地址获得数据的字节流
     *
     * @param strUr 本地连接地址
     * @return
     */
    public static byte[] getImageFromLocalByUrl(String strUrl) {
        try {
            File imageFile = new File(strUrl);
            InputStream inStream = new FileInputStream(imageFile);
            byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
            return btImg;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 改变图片的大小到宽为size,然后高随着宽等比例变化
     * @param is 上传的图片的输入流
     * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream
     * @param size 新图片的宽
     * @param format 新图片的格式
     * @throws IOException
     */
    public static OutputStream resizeImage(String fileName, String newFileName, int size, String format) throws IOException {
        InputStream is = new FileInputStream(new File(fileName));
        OutputStream os = new FileOutputStream(new File(newFileName));
        BufferedImage prevImage = ImageIO.read(is);
        double width = prevImage.getWidth();
        double height = prevImage.getHeight();
        double percent = size/width;
        int newWidth = (int)(width * percent);
        int newHeight = (int)(height * percent);
        BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);
        Graphics graphics = image.createGraphics();
        graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);
        ImageIO.write(image, format, os);
        os.flush();
        is.close();
        os.close();
        return os;
    }

}

其中用到的额外的包, 在压缩图片时用到的:

<dependency>
    <groupId>com.xiaoleilu</groupId>
    <artifactId>hutool-all</artifactId>
    <version>3.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.io -->
<dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.io</artifactId>
    <version>2.4</version>
</dependency>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值