【JAVA秒会技术之玩转图片】图片下载和等比或指定大小压缩快速实现

简介: JAVA图片下载和等比或指定大小压缩工具类 话不多,直接上代码: package com.netease.test;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RenderingHints;import java.awt
JAVA图片下载 等比或指定大小压缩 工具类


话不多,直接上代码:
package com.netease.test;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.apache.commons.lang.StringUtils;
/**
 * 图片万能操作工具类
 * <p>Title: ImgUtils</p>
 * @author  Liyan
 * @date    2017年4月14日 下午2:59:42
 */
public class ImgUtils {
	
    private static BufferedOutputStream bos;
    
    /**
     * 根据图片url下载到本地
     * <p>Title: downLoadByUrl</p>
     * @author Liyan
     * @date   2017年4月14日 下午3:04:36
     * @param imgUrl 图片地址
     * @param location 下载后保存的地址。如"C:\\"
     * @param imgName 下载后保存的名称。如"a.jpg"
     * @return Boolean true 成功;false 失败
     */
    public static Boolean downLoadByUrl(String imgUrl, String location, String imgName) {
    	try {
        	//图片的url
        	if (StringUtils.isEmpty(imgUrl) || StringUtils.isEmpty(location) || StringUtils.isEmpty(imgName)) {
				return false;
			}
        	//设置图片下载后的保存位置及图片名称
        	File file = new File(location, imgName);
            InputStream inputStream = ImgUtils.getInputStreamByGet(imgUrl);
            ImgUtils.saveData(inputStream, file);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 等比缩放图片(按高度或宽度)
     * <p>Title: equalRatioResizeImage</p>
     * @author Liyan
     * @date   2017年4月14日 下午4:53:33
     * @param srcImgPath 原始照片的磁盘位置
     * @param distImgPath 目标照片的磁盘位置
     * @param width 宽度(单位像素) 注意:和height只能填一个,都填写默认按宽度计算
     * @param height 高度(单位像素) 注意:和width只能填一个,都填写默认按宽度计算
     * @return Boolean true 成功;false 失败
     */
    public static Boolean equalRatioResizeImage (String srcImgPath, String distImgPath, int newWidth, int newHeight){  
    	try {
    		//参数校验
    		if (StringUtils.isEmpty(srcImgPath) || StringUtils.isEmpty(distImgPath)) {
    			return false;
			}
    		//获取图片原始尺寸
	    	Image srcFile = ImageIO.read(new File(srcImgPath)); 
	        int w = srcFile.getWidth(null);    
	        int h = srcFile.getHeight(null);    
	        double bili;    
	        if(newWidth>0){    
	            bili=newWidth/(double)w;    
	            newHeight = (int) (h*bili);    
	        }else{    
	            if(newHeight>0){    
	                bili=newHeight/(double)h;    
	                newWidth = (int) (w*bili);    
	            }    
	        } 
    		return ImgUtils.resizeImage(srcImgPath, distImgPath, newWidth, newHeight);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
    }  
    
    /**
     * 压缩图片(指定尺寸)
     * <p>Title: resizeImage</p>
     * @author Liyan
     * @date   2017年4月14日 下午3:31:10
     * @param srcImgPath 原始照片的磁盘位置
     * @param distImgPath 目标照片的磁盘位置
     * @param width 宽度(单位像素)
     * @param height 高度(单位像素)
     * @return Boolean true 成功;false 失败 
     */
    public static Boolean resizeImage (String srcImgPath, String distImgPath, int width, int height){  
        try {
			String subfix = "jpg";
	        subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
	        File srcFile = new File(srcImgPath);  
	        Image srcImg = ImageIO.read(srcFile);  
	        BufferedImage buffImg = null; 
	        if(subfix.equals("png")){
	            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
	        }else{
	            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	        }
	        Graphics2D graphics = buffImg.createGraphics();
	        graphics.setBackground(Color.WHITE);
	        graphics.setColor(Color.WHITE);
	        graphics.fillRect(0, 0, width, height);
	        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
	        Image scaledInstance = srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH);
	        graphics.drawImage(scaledInstance, 0, 0, null);  
	        ImageIO.write(buffImg, subfix, new File(distImgPath)); 
	        return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} 
    }  
    
    
	/**
     * 通过get请求得到读取器响应数据的数据流
     * <p>Title: getInputStreamByGet</p>
     * @author Liyan
	 * @throws IOException 
	 * @throws MalformedURLException 
     * @date   2017年4月14日 下午2:54:25
     */
    private static InputStream getInputStreamByGet(String url) throws MalformedURLException, IOException {
    	HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setReadTimeout(5000);
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");

        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream inputStream = conn.getInputStream();
            return inputStream;
        }
        return null;
    }

    /**
     * 将服务器响应的数据流存到本地文件
     * <p>Title: saveData</p>
     * @author Liyan
     * @throws IOException 
     * @date   2017年4月14日 下午2:54:44
     */
    private static void saveData(InputStream is, File file) throws IOException {
    	BufferedInputStream bis = new BufferedInputStream(is);
    	bos = new BufferedOutputStream(new FileOutputStream(file));
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
            bos.flush();
        }
    }
    
    /**
     * 测试
     * <p>Title: main</p>
     * @author Liyan
     * @date   2017年4月14日 下午2:54:53
     */
    public static void main(String[] args) {
    	//根据图片url下载到本地
    	Boolean b1 = ImgUtils.downLoadByUrl("https://nos.netease.com/nim/MTAzODg1MQ==/bmltYV8yMjI1NDAwOThfMTQ5MDMzNjIwMTU0OV9mZjM0MzUzMC1jZTk0LTRkNDItYjJlZS1lNWFlYWE0MTJjZmU=?imageView&interlace=1&crop=0_0_1512_1653", "C://", "mydog.jpg");
        if (b1) {
        	System.out.println("测试【根据图片url下载到本地】成功");
		}
        //测试指定尺寸压缩图片
        Boolean b2 = ImgUtils.resizeImage("C:\\mydog.jpg","C:\\compressDog.jpg",302,330); 
        if (b2) {
        	System.out.println("测试【压缩图片】成功");
		}
        //测试按宽度等比压缩
        Boolean b3 = ImgUtils.equalRatioResizeImage("C:\\mydog.jpg","C:\\compressDog2.jpg",151,0); 
        if (b3) {
        	System.out.println("测试【按高度等比压缩】成功");
		}
        
    }
}


运行结果:
mydog.jpg


compressDog.jpg


compressDog2.jpg


PS:这是博主家养的小狗叫“胖胖”,大笑~~~

相关文章
|
23天前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
122 44
|
17天前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
196 1
|
2月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
59 4
|
2月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
417 1
|
3月前
|
人工智能 Java
Java多任务编排技术
JDK 5引入Future接口实现异步任务处理,但获取结果不够灵活。Java 8新增CompletableFuture,实现异步任务编排,支持流式处理、多任务组合及异常处理,提升执行效率与代码可读性,简化并发编程复杂度。
|
6天前
|
前端开发 Java API
Java入门教程:掌握Spring MVC的双向数据绑定技术
以上步骤展示了如何利用 Spring MVC 实现双向数据绑定:从显示表单、提交表单、验证输入、直至返回结果页面都涉及到不同层次间交互过程,在整个过程都无需手动去编写繁琐代码去手动获取或设置每一项值。
56 20
|
2月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
301 4
|
17天前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
98 0
|
2月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
143 3
|
3月前
|
存储 Java Linux
操作系统层面视角下 Java IO 的演进路径及核心技术变革解析
本文从操作系统层面深入解析Java IO的演进历程,涵盖BIO、NIO、多路复用器及Netty等核心技术。分析各阶段IO模型的原理、优缺点及系统调用机制,探讨Java如何通过底层优化提升并发性能与数据处理效率,全面呈现IO技术的变革路径与发展趋势。
63 2