/** * 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类学习实例,比较零乱,没有怎么整理,都是些初级的例子,学习Java的新手或许可以参考。
ARM实用原代码大全!包括I2C,SPI,GUI,CAN,UART等等,绝对详尽的低层C原代码,并有详细的讲解和注释,ARM初,中级学者必备! 说多了没用看了就知道! 经典
多个生产者与多个消费者共用资源,用java代码实现,操作系统的实验,还有报告,下次再发
以前发了一个,现在再发一个我同学写的,也很好的
Java平台下的四种进程调度算法的模拟实现,代码精简,内有详细注释,看不懂随时call我。原来的代码有些问题,这个已改正,原来删不掉,没办法,再发了一个,原来下载过的可以直接问我要。
再发一个俄罗斯方块游戏的源码,基于VC语言再发一个俄罗斯方块游戏的源码,基于VC语言
再发一个小型的Delphi人事管理程序,当初是在学校时候写的小程序,自己的一个小练习,功能不算多,使用有控件,可以看到的功能有:人事资料添加、修改、备案库管理、综合管理、数据备份与还原等。
再发一个Delphi重启计算机,关机,注销程序..rar
内容索引:VB源码,字符处理,文字滚动 再发一个文字滚动,基于VB代码,文字水平向右滚动,只是简单的那种,文字滚动还有些不是太平滑,不过这个可以调节,熟悉的朋友可以完善一下代码,作为基础级的文字滚动,对新手...
再发一个微分进化算法DE的小程序-DE-test.rar 晚上用了三个小时,用两个特殊函数测试了一下,结果很不错,希望对初学者有帮助哦!
看到大家对括号匹配问题很感兴趣, 再发一个用Java编写的括号匹配程序+实验报告, Funtion: 来检测C语言程序中的简单语法错误。例如:不配对的圆括号、方括号和花括号。并注意单引号、双引号和注释段的处理。
Java agent使用大全-编辑再发
自己学VB真不容易啊,好不容易写了个勉强凑合的浏览器,已经做成安装包了,大家安装后直接到安装目录下看源码即可
NULL 博文链接:https://hbing110.iteye.com/blog/356219
内容索引:VC/C++源码,游戏编程,推箱子,游戏源码 再发一个推箱子源码,基于VC++代码编写,从界面看上去,貌似不错,带背景音效,可自定义关卡,可记录已走步数,也可简易设置地图等,源代码供有一点基础的VC爱好者...
关于图像处理的一个本科生设计。主要是用了gui里的各种控件,所以就发到这里了。。。。 主要内容就是图像的基本运算,图像变换,图像增强,图像分割(还没弄完,只把边缘检测发上来了) 具体的见以下目录: 图像...
剥离出来的泛型Hibernate 博文链接:https://jhaij.iteye.com/blog/543892
360路由器再发新品.pdf
摘要:Java源码,图形操作,图片加水印 一个Java写的图片添加水印的模块源代码,貌似以前发过,现在重新再发一个,每个创作者的思路都不一样,因此看看别人写的代码可以开拓一下思路,Java图片加水印源码分享给大家。