`

再发一段java操作图像的代码

 
阅读更多
/**
 * 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("图片缩放失败");
        }
    }
}

 

发布在 http://auzll.iteye.com

分享到:
评论

相关推荐

    再发一个VB定时关机代码.rar

    再发一个VB定时关机代码,关于定时关机的功能,我想大概不需要多介绍了吧,大概就这样子,不过本程序除了定时关机外,还有很多其它实用的小功能,比如提高WINDOWS屏幕刷新速度、显示托盘图标,托盘右键菜单,图形...

    再发一些Java对象、Java类学习实例.rar

    在这个"Java对象、Java类学习实例.rar"压缩包中,你可能会找到一系列针对初学者的实例,帮助理解这两个概念。 首先,我们要了解Java中的对象。在Java中,一切皆为对象。一个对象代表了现实世界中的一个实体,它可以...

    再发经典!周立功ARM实验代码大全.rar

    《周立功ARM实验代码大全》是一份针对ARM微处理器的宝贵学习资源,包含了大量实用的底层C语言原代码,适合ARM初学者和进阶者使用。这份资料以实例为载体,涵盖了I2C,SPI,GUI,CAN,UART等多种嵌入式系统中常见的...

    再发一个基于Hibernate+Spring 泛型GenericDao 的工程源码.

    在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。Spring框架则是一个全面的企业级应用开发框架,提供了依赖注入、事务管理、AOP(面向切...

    再发一个flex builder 3的debug

    这个标题“再发一个flex builder 3的debug”暗示我们将探讨关于Flex Builder 3的调试功能。 在Flex开发过程中,调试是必不可少的步骤,它允许开发者检查代码执行流程,定位并修复错误。Flex Builder 3提供了强大的...

    再发一个用VB写的浏览器

    【标题】"再发一个用VB写的浏览器"揭示了这个项目是使用Visual Basic(VB)编程语言开发的一个自定义浏览器。Visual Basic是Microsoft推出的一种面向对象的编程工具,以其直观的编程界面和易于学习的特点而受到初学...

    再发一个Delphi重启计算机,关机,注销程序..rar

    本压缩包“再发一个Delphi重启计算机,关机,注销程序..rar”显然是提供了使用Delphi编写的相关代码,用于实现计算机的重启、关机和注销等系统级操作。在本文中,我们将详细探讨如何在Delphi中实现这些功能,以及...

    再发一个单片机多功能数字钟(十八组打铃程序,一组闹钟,原理图)

    标题中的“再发一个单片机多功能数字钟(十八组打铃程序,一组闹钟,原理图)”指的是一个基于单片机技术的多功能时钟项目,具备多种实用功能,如打铃提醒和闹钟设定。这个数字钟设计独特,不仅能够显示时间,还能...

    再发一个小型的Delphi人事管理程序

    Delphi是一种基于Object Pascal语言的集成开发环境,由Embarcadero Technologies公司开发,主要用于创建Windows桌面应用程序。这个“小型的Delphi人事管理程序”是一个初学者在学习阶段编写的项目,它展示了如何利用...

    再发一个文字滚动,基于VB代码

    内容索引:VB源码,字符处理,文字滚动 再发一个文字滚动,基于VB代码,文字水平向右滚动,只是简单的那种,文字滚动还有些不是太平滑,不过这个可以调节,熟悉的朋友可以完善一下代码,作为基础级的文字滚动,对新手...

    括号匹配(java)

    看到大家对括号匹配问题很感兴趣, 再发一个用Java编写的括号匹配程序+实验报告, Funtion: 来检测C语言程序中的简单语法错误。例如:不配对的圆括号、方括号和花括号。并注意单引号、双引号和注释段的处理。

    Java agent使用大全

    Java agent使用大全-编辑再发

    再发一个微分进化算法DE的小程序-DE-test.rar

    MATLAB是一款强大的数学计算软件,常用于科学计算、图像处理和数值分析等领域,同时也是实现各种优化算法的理想平台。 mainproject.m是主程序文件,它包含了DE算法的框架。首先,这个文件会定义问题的参数,如种群...

    再发一个俄罗斯方块游戏的源码,基于VC语言

    在C++中,可以定义一个表示方块的类,包含方块形状、颜色、位置等属性,并提供旋转、移动等操作。同时,通过定时器控制方块的下落速度,当方块到达底部或与已有方块相撞时,进行消除行的判断和处理。 3. **数据结构...

    再发一个推箱子源码,基于VC++代码编写

    内容索引:VC/C++源码,游戏编程,推箱子,游戏源码 再发一个推箱子源码,基于VC++代码编写,从界面看上去,貌似不错,带背景音效,可自定义关卡,可记录已走步数,也可简易设置地图等,源代码供有一点基础的VC爱好者...

    matlab关于图像处理的毕业设计-图像处理.rar

    关于图像处理的一个本科生设计。主要是用了gui里的各种控件,所以就发到这里了。。。。 主要内容就是图像的基本运算,图像变换,图像增强,图像分割(还没弄完,只把边缘检测发上来了) 具体的见以下目录: 图像...

    360路由器再发新品.pdf

    360路由器再发新品.pdf

    Java图片添加水印的模块含源代码

    摘要:Java源码,图形操作,图片加水印 一个Java写的图片添加水印的模块源代码,貌似以前发过,现在重新再发一个,每个创作者的思路都不一样,因此看看别人写的代码可以开拓一下思路,Java图片加水印源码分享给大家。

    webshell连接工具冰蝎2.0,后面有三点零的,找一找再发

    冰蝎是一个功能强大的Web后门客户端,它允许用户通过Web接口控制和管理目标服务器,执行各种命令,如上传、下载文件,执行系统命令,甚至进行数据库操作。 【描述】中的“做渗透的,不支持恶意攻击”强调了这个工具...

    再发一个android音乐播放器

    摘要:Java源码,Android,Android源码 android音乐播放器源码,以前发过的,今天再发一个,每个开发者的编程思路和实现方法都不同,所以多看几款,你就了解了android音乐播放器的编程要点,本源码包括编译生成的APK...

Global site tag (gtag.js) - Google Analytics