Java实现按高度或宽度等比压缩图片尺寸

要实现一个能够按高度或宽度等比压缩图片并返回InputStream的Java方法,你需要先计算图片的原始宽高比,然后根据目标尺寸(宽度或高度)计算出等比缩放后的另一个维度。以下是一个示例代码:

import javax.imageio.ImageIO;  
import java.awt.Graphics2D;  
import java.awt.Image;  
import java.awt.image.BufferedImage;  
import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  public class ImageResizer {  public static InputStream resizeImage(InputStream srcInputStream, int targetWidth, int targetHeight) throws IOException {  // 读取原始图片  BufferedImage originalImage = ImageIO.read(srcInputStream);  // 计算等比缩放后的尺寸  int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();  double originalWidth = originalImage.getWidth();  double originalHeight = originalImage.getHeight();  double aspectRatio = originalWidth / originalHeight;  if (targetWidth == 0) {  targetWidth = (int) (targetHeight * aspectRatio);  } else if (targetHeight == 0) {  targetHeight = (int) (targetWidth / aspectRatio);  }  // 创建一个新的BufferedImage,类型为原始图片的类型  BufferedImage resizedImage = new BufferedImage((int) targetWidth, (int) targetHeight, type);  // 使用Graphics2D来绘制缩小后的图片  Graphics2D g2d = resizedImage.createGraphics();  g2d.drawImage(originalImage, 0, 0, (int) targetWidth, (int) targetHeight, null);  g2d.dispose();  // 将缩小后的图片写入到ByteArrayOutputStream中  ByteArrayOutputStream baos = new ByteArrayOutputStream();  ImageIO.write(resizedImage, "jpg", baos);  // 将ByteArrayOutputStream转换为InputStream  return new ByteArrayInputStream(baos.toByteArray());  }  public static void main(String[] args) {  try {  // 假设你有一个图片文件的InputStream,这里我们使用一个模拟的InputStream作为示例  // InputStream srcInputStream = new FileInputStream("path_to_your_original_image.jpg");  // 为了演示,我们使用一个空的InputStream(实际中你需要替换为真实的图片InputStream)  InputStream srcInputStream = new ByteArrayInputStream(new byte[0]); // 示例,应替换为真实图片数据  int targetWidth = 800; // 目标宽度,可以为0表示按高度缩放  int targetHeight = 600; // 目标高度,可以为0表示按宽度缩放  // 调用resizeImage方法并获取InputStream  InputStream resizedInputStream = resizeImage(srcInputStream, targetWidth, targetHeight);  // 在这里,你可以使用resizedInputStream来进一步处理图片,比如保存到文件或传输到网络等  // ...  // 关闭流(在实际应用中,确保在使用完流后关闭它们)  resizedInputStream.close();  // srcInputStream.close(); // 如果你使用了真实的文件InputStream,也请确保关闭它  } catch (IOException e) {  e.printStackTrace();  }  }  
}

注意

  1. 在这个示例中,srcInputStream是一个模拟的InputStream,你应该替换为指向你的图片文件的真实InputStream
  2. 代码中的targetWidthtargetHeight参数允许你指定目标尺寸。如果你只想按宽度缩放,可以设置targetHeight为0;如果你只想按高度缩放,可以设置targetWidth为0。
  3. 使用ByteArrayOutputStreamByteArrayInputStream可以在内存中处理图片数据,这对于不需要将图片保存到文件系统的场景很有用。
  4. 在处理完InputStream后,确保关闭它以释放资源。如果你从文件中读取InputStream,也请确保关闭它。在上面的示例中,由于srcInputStream是一个模拟的流,所以我没有关闭它。但在实际使用中,你应该始终关闭文件流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解cpu对地址的操作

在硬件编程中,外设寄存器被映射到内存或输入/输出(I/O)的地址空间上,这种映射使得CPU能够通过读写这些地址来控制外设。这种机制通常被称为内存映射I/O(MMIO)或端口映射I/O(PMIO),其中MMIO更为常见。以GPIO(通用输入输出)为例,下面是这个过程的一般性描述: MMIO(…

【云原生】MiniKube部署Kubernetes最小化集群

MiniKube安装Kubernetes集群(一步到位) 文章目录 MiniKube安装Kubernetes集群(一步到位)资源列表基础环境一、环境配置1.1、更新系统1.2、安装Docker1.3、配置Docker加速器 二、部署MiniKube2.1、安装kubectl2.2、安装MiniKube2.2…

深入了解Qt 控件:Display Widgets部件(1) 以及 QT自定义控件(电池)

QT自定义控件(电池) 在线调色板Qt之CSS专栏Chapter1 QT自定义控件(电池)Chapter2 Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件(1)1 Display Widgets简介2 如何使用Display Widgets部件 Chapter3 Qt自定义控件电池组件使用前言一、最基…

“论大数据处理架构及其应用”高分范文,软考高级,系统架构设计师

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面,旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构,它是一种将批处理和流…

springboot 3.x相比之前版本有什么区别

Spring Boot 3.x相比之前的版本(尤其是Spring Boot 2.x),主要存在以下几个显著的区别和新特性: Java版本要求: Spring Boot 3.x要求至少使用Java 17作为最低版本,同时已经通过了Java 19的测试,…

第十一章 Qt的模型视图

目录 一、模型/视图的原理 1、原理分析 2、模型(数据模型) 3、视图 4、代理 二、文件系统模型 1、项目练习 2、UI 设计 3、代码实现 三、字符串链表模型 QStringListModel 1、项目效果 2、项目实现 四、标准项模型(QStandardItemModel) 1、模型分析 2、项目效…

Java内存管理策略与性能调优

Java内存管理策略与性能调优 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 Java作为一种广泛应用于企业级应用开发的编程语言,其内存管理和…

Java+JSP+Mysql+Tomcat实现Web图书管理系统

简介: 本项目是基于springspringmvcJdbcTemplate实现的图书馆管理系统,包含基本的增删改查功能,可作为JavaWeb初学者的入门学习案例。 环境要求: java8 mysql5.7及以下 eclipse最新版 项目目录 模块设计 页面设计 1. 登录页…

微信小程序怎样跳转页面?

在微信小程序中,页面跳转通常使用 wx.navigateTo、wx.redirectTo、wx.switchTab、wx.navigateBack 以及 wx.reLaunch 等API。这些API提供了不同的页面跳转方式,适用于不同的场景。 以下是这些API的详细代码示例和说明: 1.wx.navigateTo&…

TEB(Time Elastic Band)局部路径规划算法详解及代码实现

一、题外话 经济的持续低迷让一线打工者们情绪焦虑、对未来丧失信心,导致保守消费;企业端也是想着降本增效,裁员收缩。而在主流经济界有两种拉动经济的方式,第一是通过生产拉动经济、第二是通过消费拉动经济,毫无疑问…

android 定时调用方法

在Android中,可以使用Handler类和Runnable接口来实现定时调用方法。以下是一个简单的例子,展示了如何每隔一定时间调用一个方法。 import android.os.Handler; import android.os.SystemClock; import androidx.appcompat.app.AppCompatActivity; impor…

【Python系列】Python 项目 Docker 部署指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux多进程和多线程(三)进程间通讯-信号处理方式和自定义处理函数

进程间通信之信号 信号信号的种类 信号在操作系统中的定义如下: 信号的处理流程在 Linux 中对信号的处理⽅式 自定义信号处理函数 信号的发送 kill() 函数:raise() 函数: 示例 : 创建⼀个⼦进程,⼦进程通过信号暂停,⽗进程发送 终⽌信号等待信号 pause()…

风控图算法之社群发现算法(小数据集Python版)

风控图算法之社群发现算法(小数据集Python版) 在风险控制领域,图算法扮演着日益重要的角色。(这方面的资料有很多,不再赘述) 图算法在风控场景的应用 图分析方法在业务风控中的应用 特别是社群发现算法&a…

基于pytorch实现的 MobileViT 的图像识别(迁移学习)

1、介绍 MobileViT 轻量级的分类识别网络,结合了CNN卷积和Transformer 混合的网络架构 关于更多介绍可以自行百度,本文通过pytorchpython进行实现 更多基础的图像分类网络,参考:图像分类_听风吹等浪起的博客-CSDN博客 2、相关代…

npm简介与安装方法/管理与依赖管理/脚本命令与自定义

npm简介与安装方法 什么是npm? npm(Node Package Manager)是Node.js的包管理工具和包管理系统,广泛用于JavaScript生态系统中。npm主要有以下几个功能: 包管理器:安装、更新、卸载Node.js包。项目管理工…

DB-GPT 文档切分报错

感谢阅读 配置完知识库,进行切分报错切分完成后,进行问答时后台日志报错 配置完知识库,进行切分报错 报的错如下 document sync error cryptography>3.1 is required for AES algorithm pip install -U cryptography 之后重新运行程序 …

SimpleService 一个简单的Windows Service定时服务

SimpleService 介绍 一个简单的Windows Service定时服务 SimpleService: 一个简单的Windows Service定时服务 使用说明

kimi AI,文生流程图,一句话kimi当场出图

kimi AI善于读长文、搜网页,主打功能包括整理资料、解读文件、辅助编程、文案写作等。 今天我们就让kimi帮我们一键生成流程图,再也不用自己画了: 不看广告看疗效: 告诉kimi使用Mermaid直接生成流程图,kimi直接生成…

AI是如何与快充技术结合的?

针对AI技术在快充领域的运用,我们可以进一步深入探讨AI如何与快充技术结合,提升充电效率和用户体验。以下是一些具体的AI技术在快充领域的应用场景: 一、智能充电算法 学习充电模式:AI算法可以学习用户的充电习惯,比…