/** * http://auzll.iteye.com */ package z.tool.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import z.tool.checker.HumanNeededError; import z.tool.checker.LogicError; /** * 图片工具类 * @author auzll */ public final class ImageUtil { private static final Logger LOG = Logger.getLogger(ImageUtil.class); /** * 从{@link javax.imageio.spi.ImageReaderWriterSpi}的实现类中整理出来所有支持的图片类型 */ public static enum ImageType { JPEG, PNG, GIF, WBMP } /** * 等比例缩放图片(Jpeg) */ public static void resizeAsJpeg(File srcFile, File destFile, int maxNewHeight, int maxNewWidth) { resize(srcFile, ImageType.JPEG, destFile, maxNewHeight, maxNewWidth); } /** * 等比例缩放图片(Png) */ public static void resizeAsPng(File srcFile, File destFile, int maxNewHeight, int maxNewWidth) { resize(srcFile, ImageType.PNG, destFile, maxNewHeight, maxNewWidth); } /** * 等比例缩放图片(Gif) */ public static void resizeAsGif(File srcFile, File destFile, int maxNewHeight, int maxNewWidth) { resize(srcFile, ImageType.GIF, destFile, maxNewHeight, maxNewWidth); } /** * 等比例缩放图片(Wbmp) */ public static void resizeAsWbmp(File srcFile, File destFile, int maxNewHeight, int maxNewWidth) { resize(srcFile, ImageType.WBMP, destFile, maxNewHeight, maxNewWidth); } /** * 等比例缩放图片 */ public static void resize(File srcFile, ImageType destType, File destFile, int maxNewHeight, int maxNewWidth) { if (null == srcFile || !srcFile.exists()) { if (LOG.isDebugEnabled()) { LOG.debug("method:resize,srcFile:" + (null != srcFile ? srcFile.getAbsolutePath() : null) + ",descr:file not found"); } throw new LogicError("缩放的源文件不存在"); } if (null == destType) { throw new LogicError("未指定缩放图片类型"); } if (null == destFile) { throw new LogicError("缩放的目标文件为空"); } if (maxNewHeight < 1 | maxNewWidth < 1) { throw new LogicError("缩放尺寸错误,不能小于0"); } try { Image srcImage = ImageIO.read(srcFile); // 原始图片大小 int srcImageWidth = srcImage.getWidth(null); int srcImageHeight = srcImage.getHeight(null); // 原始宽高超过设定的最大宽高 if (srcImageWidth > maxNewWidth || srcImageHeight > maxNewHeight) { // 计算缩放大小 if (srcImageWidth >= srcImageHeight) { // 原始图片的宽度大于高度,需要缩小缩放后的最大高度 maxNewHeight = (int) Math.round((srcImageHeight * maxNewWidth * 1.0 / srcImageWidth)); } else { // 否则,缩小缩放后的最大宽度 maxNewWidth = (int) Math.round((srcImageWidth * maxNewHeight * 1.0 / srcImageHeight)); } } BufferedImage distImage = new BufferedImage(maxNewWidth, maxNewHeight, BufferedImage.TYPE_INT_RGB); // 绘制新图 distImage.getGraphics().drawImage(srcImage.getScaledInstance(maxNewWidth, maxNewHeight, Image.SCALE_SMOOTH), 0, 0, null); // 输出到文件流 OutputStream os = null; try { os = new FileOutputStream(destFile); ImageIO.write(distImage, destType.name(), os); os.flush(); } finally { IOUtils.closeQuietly(os); } } catch (IOException e) { LOG.error("method:resize,srcFile:" + (null != srcFile ? srcFile.getAbsolutePath() : null) + ",destFile:" + (null != destFile ? destFile.getAbsolutePath() : null) + ",destType:" + destType + ",maxNewHeight:" + maxNewHeight + ",maxNewWidth:" + maxNewWidth + ",errorMsg:" + e.getMessage(), e); throw new HumanNeededError("图片缩放失败"); } } }
相关推荐
再发一个VB定时关机代码,关于定时关机的功能,我想大概不需要多介绍了吧,大概就这样子,不过本程序除了定时关机外,还有很多其它实用的小功能,比如提高WINDOWS屏幕刷新速度、显示托盘图标,托盘右键菜单,图形...
在这个"Java对象、Java类学习实例.rar"压缩包中,你可能会找到一系列针对初学者的实例,帮助理解这两个概念。 首先,我们要了解Java中的对象。在Java中,一切皆为对象。一个对象代表了现实世界中的一个实体,它可以...
《周立功ARM实验代码大全》是一份针对ARM微处理器的宝贵学习资源,包含了大量实用的底层C语言原代码,适合ARM初学者和进阶者使用。这份资料以实例为载体,涵盖了I2C,SPI,GUI,CAN,UART等多种嵌入式系统中常见的...
在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。Spring框架则是一个全面的企业级应用开发框架,提供了依赖注入、事务管理、AOP(面向切...
这个标题“再发一个flex builder 3的debug”暗示我们将探讨关于Flex Builder 3的调试功能。 在Flex开发过程中,调试是必不可少的步骤,它允许开发者检查代码执行流程,定位并修复错误。Flex Builder 3提供了强大的...
【标题】"再发一个用VB写的浏览器"揭示了这个项目是使用Visual Basic(VB)编程语言开发的一个自定义浏览器。Visual Basic是Microsoft推出的一种面向对象的编程工具,以其直观的编程界面和易于学习的特点而受到初学...
本压缩包“再发一个Delphi重启计算机,关机,注销程序..rar”显然是提供了使用Delphi编写的相关代码,用于实现计算机的重启、关机和注销等系统级操作。在本文中,我们将详细探讨如何在Delphi中实现这些功能,以及...
标题中的“再发一个单片机多功能数字钟(十八组打铃程序,一组闹钟,原理图)”指的是一个基于单片机技术的多功能时钟项目,具备多种实用功能,如打铃提醒和闹钟设定。这个数字钟设计独特,不仅能够显示时间,还能...
Delphi是一种基于Object Pascal语言的集成开发环境,由Embarcadero Technologies公司开发,主要用于创建Windows桌面应用程序。这个“小型的Delphi人事管理程序”是一个初学者在学习阶段编写的项目,它展示了如何利用...
内容索引:VB源码,字符处理,文字滚动 再发一个文字滚动,基于VB代码,文字水平向右滚动,只是简单的那种,文字滚动还有些不是太平滑,不过这个可以调节,熟悉的朋友可以完善一下代码,作为基础级的文字滚动,对新手...
看到大家对括号匹配问题很感兴趣, 再发一个用Java编写的括号匹配程序+实验报告, Funtion: 来检测C语言程序中的简单语法错误。例如:不配对的圆括号、方括号和花括号。并注意单引号、双引号和注释段的处理。
Java agent使用大全-编辑再发
MATLAB是一款强大的数学计算软件,常用于科学计算、图像处理和数值分析等领域,同时也是实现各种优化算法的理想平台。 mainproject.m是主程序文件,它包含了DE算法的框架。首先,这个文件会定义问题的参数,如种群...
在C++中,可以定义一个表示方块的类,包含方块形状、颜色、位置等属性,并提供旋转、移动等操作。同时,通过定时器控制方块的下落速度,当方块到达底部或与已有方块相撞时,进行消除行的判断和处理。 3. **数据结构...
内容索引:VC/C++源码,游戏编程,推箱子,游戏源码 再发一个推箱子源码,基于VC++代码编写,从界面看上去,貌似不错,带背景音效,可自定义关卡,可记录已走步数,也可简易设置地图等,源代码供有一点基础的VC爱好者...
关于图像处理的一个本科生设计。主要是用了gui里的各种控件,所以就发到这里了。。。。 主要内容就是图像的基本运算,图像变换,图像增强,图像分割(还没弄完,只把边缘检测发上来了) 具体的见以下目录: 图像...
360路由器再发新品.pdf
摘要:Java源码,图形操作,图片加水印 一个Java写的图片添加水印的模块源代码,貌似以前发过,现在重新再发一个,每个创作者的思路都不一样,因此看看别人写的代码可以开拓一下思路,Java图片加水印源码分享给大家。
冰蝎是一个功能强大的Web后门客户端,它允许用户通过Web接口控制和管理目标服务器,执行各种命令,如上传、下载文件,执行系统命令,甚至进行数据库操作。 【描述】中的“做渗透的,不支持恶意攻击”强调了这个工具...
摘要:Java源码,Android,Android源码 android音乐播放器源码,以前发过的,今天再发一个,每个开发者的编程思路和实现方法都不同,所以多看几款,你就了解了android音乐播放器的编程要点,本源码包括编译生成的APK...