Java 从网页指定url获取图片并压缩到本地

运行平台: windows10
JDK版本: 1.8
IDE: eclipse

一. 知识储备

Java IO流 :
  推荐博客: Java IO详解
  本文用到的IO方法:

DataInputStream;
BufferedInputStream;
FileOutputStream;
BufferedOutputStream;

BufferedImage类:
  简单地说,BufferedImage类是一个能够操作图片的类。类似文件流,BufferedImage以图片流的形式进行各种操作,它是Image的子类。官方API链接
使用到的方法:

  1. BufferedImage.createGraphics():创建一个能被写进BufferedImage里的图像类Graphics2D
  2. Graphics.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer):该方法将图片 img,依照给定的width/height生成压缩后的图片,写入Graphics.

ImageIO类:
  一个便于图片读写,并能够进行简单编码解码的静态类.
  官方API链接

二. 代码思路

  1. 根据url从服务器获取到原图,保存到缓存中
    1. 获取url的输入流 dataInputStream
    2. 构造BufferedInputStream来优化读写效率
    3. 构造原始图片流 preImage

  2. 确定压缩比例
    1. 获得原始图片的长宽 width/height
    2. 定义压缩比例为原来的1/2

  3. 根据压缩比例,按照原图绘制出压缩后的新图
    1. 构造压缩后的图片流 image 长宽各为原来的1/2
    2. 给图片流image创建Graphics ,在Graphics上绘制压缩后的图片

  4. 将新图写入文件,保存到磁盘
    1. file生成对应的文件输出流,并将image传给输出流
    2. 将image写入到file中
    3. 关闭输入输出流

三. 具体实现

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class CompressedImageDownload {

    public static void main(String[] args) {

        String pathname="test.gif";//
        File file=new File(pathname);
        String urlstr="https://www.baidu.com/img/baidu_jgylogo3.gif";//此处为指定指定图片的url,以百度logo为例
        boolean success=false;
        success=downloadCompressedPicture(file, urlstr);
        System.out.println(success?"success":"false");

    }
    /**
     * url下载压缩图 
     * jdk1.8可以执行
     * jdk1.4无法执行
     * @param file
     * @param urlstr
     * @return
     */
    public static boolean downloadCompressedPicture(File file,String urlstr){
        URL url=null;
        try{
            url=new URL(urlstr);
            //1.获取url的输入流 dataInputStream
            DataInputStream dataInputStream=new DataInputStream(url.openStream());
            //2.加一层BufferedInputStream
            BufferedInputStream bufferedInputStream=new BufferedInputStream(dataInputStream);
            //3.构造原始图片流 preImage
            BufferedImage preImage=ImageIO.read(bufferedInputStream);
            //4.获得原始图片的长宽 width/height
            int width=preImage.getWidth();
            int height=preImage.getHeight();
            //5.构造压缩后的图片流 image 长宽各为原来的1/2
            BufferedImage image=new BufferedImage(width/2, height/2, BufferedImage.TYPE_INT_RGB);
            //6.给image创建Graphic ,在Graphic上绘制压缩后的图片
            Graphics graphic=image.createGraphics();
            graphic.drawImage(preImage, 0, 0, width/2, height/2, null);
            //7.为file生成对应的文件输出流
                //将image传给输出流 
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
            //8.将image写入到file中
            ImageIO.write(image, "bmp", bufferedOutputStream);
            //9.关闭输入输出流
            bufferedInputStream.close();
            bufferedOutputStream.close();

            return true;
        }catch(IOException e){
            System.out.println(e);
        }

        return false;
    }
}

四. 总结

  比较坑爹的是 ImageIO在jdk1.4中无法正确写出到磁盘中。因为公司里有个老项目用的是jdk1.4虽然最后使用了JPEGImageEncoder方法绕过了这个问题,但还是忍不住吐槽一下。都是jdk1.8的时代了,竟然还不淘汰jdk1.4 =。=

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java压缩图片可以使用 ImageIO 类,具体步骤如下: 1. 通过 URL 获取图片输入流 ```java URL url = new URL("http://example.com/image.jpg"); InputStream inputStream = url.openStream(); ``` 2. 使用 ImageIO 读取图片 ```java BufferedImage image = ImageIO.read(inputStream); ``` 3. 创建压缩后的图片缓冲区 ```java int width = image.getWidth(); int height = image.getHeight(); BufferedImage compressedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); ``` 4. 获取压缩后的图像输出流 ```java OutputStream outputStream = new FileOutputStream("compressed_image.jpg"); ``` 5. 创建 JPEGImageEncoder 对象 ```java JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream); ``` 6. 设置压缩参数 ```java JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(compressedImage); param.setQuality(0.5f, false); // 压缩质量为 50% ``` 7. 压缩图片并输出 ```java encoder.setJPEGEncodeParam(param); encoder.encode(compressedImage); ``` 完整代码如下: ```java import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; public class ImageCompressor { public static void main(String[] args) throws Exception { URL url = new URL("http://example.com/image.jpg"); InputStream inputStream = url.openStream(); BufferedImage image = ImageIO.read(inputStream); int width = image.getWidth(); int height = image.getHeight(); BufferedImage compressedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); OutputStream outputStream = new FileOutputStream("compressed_image.jpg"); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(compressedImage); param.setQuality(0.5f, false); encoder.setJPEGEncodeParam(param); encoder.encode(compressedImage); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值