`
zhangshixi
  • 浏览: 675239 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

图像处理工具类

阅读更多

在实际项目中,我们经常会遇到处理各种各样的图片问题。

比如:图片的旋转、缩放、图片格式转换、获取图片类型、验证图片大小、写入图片 等。
这里我们使用java.awt.Graphics2D来实现常用图像处理的功能,形成我们的图像处理工具类。

package com.zhangsx.util.image;

import java.util.Iterator;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

/**
 * 图像处理工具类。
 * 
 * @version 1.00 2010-1-15
 * @since 1.5
 * @author ZhangShixi
 */
public class ImageUtil {

    /**
     * 旋转图像。
     * @param bufferedImage 图像。
     * @param degree 旋转角度。
     * @return 旋转后的图像。
     */
    public static BufferedImage rotateImage(
            final BufferedImage bufferedImage, final int degree) {
        int width = bufferedImage.getWidth();
        int height = bufferedImage.getHeight();
        int type = bufferedImage.getColorModel().getTransparency();

        BufferedImage image = new BufferedImage(width, height, type);
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setRenderingHint(
                RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        graphics2D.rotate(Math.toRadians(degree), width / 2, height / 2);
        graphics2D.drawImage(bufferedImage, 0, 0, null);

        try {
            return image;
        } finally {
            if (graphics2D != null) {
                graphics2D.dispose();
            }
        }
    }

    /**
     * 将图像按照指定的比例缩放。
     * 比如需要将图像放大20%,那么调用时scale参数的值就为20;如果是缩小,则scale值为-20。
     * @param bufferedImage 图像。
     * @param scale 缩放比例。
     * @return 缩放后的图像。
     */
    public static BufferedImage resizeImageScale(
            final BufferedImage bufferedImage, final int scale) {
        if (scale == 0) {
            return bufferedImage;
        }

        int width = bufferedImage.getWidth();
        int height = bufferedImage.getHeight();

        int newWidth = 0;
        int newHeight = 0;

        double nowScale = (double) Math.abs(scale) / 100;
        if (scale > 0) {
            newWidth = (int) (width * (1 + nowScale));
            newHeight = (int) (height * (1 + nowScale));
        } else if (scale < 0) {
            newWidth = (int) (width * (1 - nowScale));
            newHeight = (int) (height * (1 - nowScale));
        }

        return resizeImage(bufferedImage, newWidth, newHeight);
    }

    /**
     * 将图像缩放到指定的宽高大小。
     * @param bufferedImage 图像。
     * @param width 新的宽度。
     * @param height 新的高度。
     * @return 缩放后的图像。
     */
    public static BufferedImage resizeImage(
            final BufferedImage bufferedImage,
            final int width, final int height) {
        int type = bufferedImage.getColorModel().getTransparency();
        BufferedImage image = new BufferedImage(width, height, type);

        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setRenderingHint(
                RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        graphics2D.drawImage(bufferedImage, 0, 0, width, height, 0, 0,
                bufferedImage.getWidth(), bufferedImage.getHeight(), null);

        try {
            return image;
        } finally {
            if (graphics2D != null) {
                graphics2D.dispose();
            }
        }
    }

    /**
     * 将图像水平翻转。
     * @param bufferedImage 图像。
     * @return 翻转后的图像。
     */
    public static BufferedImage flipImage(
            final BufferedImage bufferedImage) {
        int width = bufferedImage.getWidth();
        int height = bufferedImage.getHeight();
        int type = bufferedImage.getColorModel().getTransparency();

        BufferedImage image = new BufferedImage(width, height, type);
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.drawImage(bufferedImage, 0, 0, width, height,
                width, 0, 0, height, null);

        try {
            return image;
        } finally {
            if (graphics2D != null) {
                graphics2D.dispose();
            }
        }
    }

    /**
     * 获取图片的类型。如果是 gif、jpg、png、bmp 以外的类型则返回null。
     * @param imageBytes 图片字节数组。
     * @return 图片类型。
     * @throws java.io.IOException IO异常。
     */
    public static String getImageType(final byte[] imageBytes)
            throws IOException {
        ByteArrayInputStream input = new ByteArrayInputStream(imageBytes);
        ImageInputStream imageInput = ImageIO.createImageInputStream(input);
        Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInput);
        String type = null;
        if (iterator.hasNext()) {
            ImageReader reader = iterator.next();
            type = reader.getFormatName().toUpperCase();
        }

        try {
            return type;
        } finally {
            if (imageInput != null) {
                imageInput.close();
            }
        }
    }

    /**
     * 验证图片大小是否超出指定的尺寸。未超出指定大小返回true,超出指定大小则返回false。
     * @param imageBytes 图片字节数组。
     * @param width 图片宽度。
     * @param height 图片高度。
     * @return 验证结果。未超出指定大小返回true,超出指定大小则返回false。
     * @throws java.io.IOException IO异常。
     */
    public static boolean checkImageSize(
            final byte[] imageBytes, final int width, final int height)
            throws IOException {
        BufferedImage image = byteToImage(imageBytes);
        int sourceWidth = image.getWidth();
        int sourceHeight = image.getHeight();
        if (sourceWidth > width || sourceHeight > height) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 将图像字节数组转化为BufferedImage图像实例。
     * @param imageBytes 图像字节数组。
     * @return BufferedImage图像实例。
     * @throws java.io.IOException IO异常。
     */
    public static BufferedImage byteToImage(
            final byte[] imageBytes) throws IOException {
        ByteArrayInputStream input = new ByteArrayInputStream(imageBytes);
        BufferedImage image = ImageIO.read(input);

        try {
            return image;
        } finally {
            if (input != null) {
                input.close();
            }
        }
    }

    /**
     * 将BufferedImage持有的图像转化为指定图像格式的字节数组。
     * @param bufferedImage 图像。
     * @param formatName 图像格式名称。
     * @return 指定图像格式的字节数组。
     * @throws java.io.IOException IO异常。
     */
    public static byte[] imageToByte(
            final BufferedImage bufferedImage, final String formatName)
            throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, formatName, output);

        try {
            return output.toByteArray();
        } finally {
            if (output != null) {
                output.close();
            }
        }
    }

    /**
     * 将图像以指定的格式进行输出,调用者需自行关闭输出流。
     * @param bufferedImage 图像。
     * @param output 输出流。
     * @param formatName 图片格式名称。
     * @throws java.io.IOException IO异常。
     */
    public static void writeImage(final BufferedImage bufferedImage,
            final OutputStream output, final String formatName)
            throws IOException {
        ImageIO.write(bufferedImage, formatName, output);
    }

    /**
     * 将图像以指定的格式进行输出,调用者需自行关闭输出流。
     * @param imageBytes 图像的byte数组。
     * @param output 输出流。
     * @param formatName 图片格式名称。
     * @throws java.io.IOException IO异常。
     */
    public static void writeImage(final byte[] imageBytes,
            final OutputStream output, final String formatName)
            throws IOException {
        BufferedImage image = byteToImage(imageBytes);
        ImageIO.write(image, formatName, output);
    }
}
 
6
5
分享到:
评论
2 楼 zhangshixi 2010-04-12  
snowolf 写道
呵呵,貌似比我那个等比例缩放的实现更好用!

呵呵,共同学习啊~
1 楼 snowolf 2010-04-12  
呵呵,貌似比我那个等比例缩放的实现更好用!

相关推荐

    图像处理工具类测试.rar_图像处理工具类测试_图像旋转

    综上所述,C#中的图像处理工具类提供了一种简单而有效的方式来处理图像,包括旋转。通过理解并运用这些类和方法,开发者可以创建出各种强大的图像处理应用程序,满足不同需求。这个测试案例就是对这一能力的一个展示...

    图像处理工具类比较好用的图像处理工具类

    在这个主题中,我们将深入探讨AForge.NET这个库,以及它如何作为一个好用的图像处理工具类。 AForge.NET是一个由.NET Framework支持的开源库,包含了大量用于图像处理、机器学习、模式识别等领域的算法。这个库以C#...

    java工具类:图像处理类

    内容概要:图像处理工具类,图像任意格式互相转换,彩色图像转换为黑白图像,图像按尺寸或按比例放大和缩小,读取本地(文件流或文件名)图像,读取网络图像,截取图像,按指定格式输出,获取指定图像的大小和尺寸,...

    虚拟视频参数修改工具箱_虚拟视频参数修改工具箱exe,虚拟视频参数修改工具箱-图像处理工具类资源

    虚拟视频参数修改工具箱是一款专为图像处理设计的软件,主要功能是针对虚拟视频源进行参数调整和优化。它能够帮助用户对视频流中的各种参数进行精细化设置,以适应不同的应用环境和需求。例如,如果你在进行网络直播...

    图像处理库常用的工具类

    本篇文章将深入探讨图像处理库中常见的工具类,包括积分图像、距离变换、边缘检测和矩阵运算,这些都是图像处理的核心概念。 首先,我们来了解积分图像。积分图像,也称为Summed Area Table (SAT),是一种快速计算...

    C#实现的图像处理工具包

    本项目是基于C#语言实现的图像处理工具包,它提供了一系列高效且用户友好的功能,如图像灰度直方图计算、图像平滑、图像增强以及图像纠正。下面将详细介绍这些知识点。 1. **C#实现的图像处理**: C#是一种广泛...

    JAVA28个常用工具类

    2. **ImageUtils.java**: 图像处理工具类,可能包含了对图像进行缩放、裁剪、旋转、合并等操作的功能。它可能会利用Java的`javax.imageio`包或者第三方库如Apache Commons Imaging (formerly known as Sanselan)来...

    基于Android的图像基本处理示例设计

    本项目旨在设计一个基于Android平台的图像基本处理示例应用,主要功能包括图像的颜色矩阵变换、图像像素效果处理、基本颜色操作以及相关图像处理工具类。应用通过提供多种图像处理操作,展示如何在Android环境下实现...

    matlab遥感图像处理工具包

    在遥感领域,MATLAB提供了专门的遥感图像处理工具包,这使得科学家和工程师能够对卫星和航空图像进行深入分析和处理。本工具包具有丰富的功能,旨在帮助用户在多个层面理解和解析遥感数据。 遥感图像处理涉及的环节...

    图像处理工具包(C#)

    本项目提供的"图像处理工具包(C#)"是专为C#开发者设计的一个库,它包含了一系列用于处理图像的类和方法,使得在.NET环境中进行图像操作变得简单易行。 1. **C#语言基础**: C#是一种面向对象的编程语言,由微软...

    MATLAB图像处理工具箱函数很全的阿-附录 MATLAB图像处理工具箱函数.doc

    MATLAB 图像处理工具箱函数大全 MATLAB 图像处理工具箱函数大全是 MATLAB 中的一组强大的图像处理函数,涵盖了图像处理的各个方面。本文档将对这些函数进行分类和详细介绍,以便读者更好地理解和使用这些函数。 一...

    NET常用工具类

    图像处理工具类,可能包含裁剪、缩放、旋转、加水印等图像操作功能。在图形界面应用、社交媒体分享、图像分析等场景中,JImage.cs能帮助开发者快速实现图像处理需求。 9. **JValidate.cs**: 验证工具类,用于...

    C#中基于GDI+(Graphics)图像处理工具(缩略图、压缩优化、任意角度旋转、透明水印)

    在C#编程中,GDI+(Graphics Device Interface ...在提供的“图像处理工具类测试”文件中,应包含具体的代码实现,通过单元测试确保每个功能的正确性。开发者可以依据这些代码进行学习和自定义,以满足特定的项目需求。

    MATLAB图像处理工具箱函数的使用说明

    MATLAB 图像处理工具箱函数的使用说明 MATLAB 图像处理工具箱是一种功能强大且灵活的图像处理工具箱,它提供了大量的图像处理函数,能够满足用户对图像处理的各种需求。下面将对 MATLAB 图像处理工具箱的使用进行...

    java实现图像处理小工具

    - **ImageProject.jar**:这是Java应用程序的可执行文件,包含了所有的类和资源,可以直接运行以启动图像处理工具。 - **file.properties**:这可能是一个配置文件,用于存储应用程序的设置或默认参数,如用户自定义...

    基于matlab的医学图像处理工具箱

    **基于MATLAB的医学图像处理工具箱** MATLAB(矩阵实验室)是一款强大的数学计算软件,其丰富的库函数和用户友好的界面使其成为科学研究和工程应用的理想选择。在医学领域,MATLAB提供了专门的医学图像处理工具箱,...

    一个图像处理的毕业设计

    在这个项目中,MATLAB被选用为开发平台,MATLAB是一个强大的数学计算软件,拥有丰富的图像处理工具箱,能方便地实现各种图像处理算法。 首先,滤波算法是图像处理中的核心部分。滤波通常用于去除图像中的噪声,平滑...

    matlab图像处理工具箱函数

    Matlab 图像处理工具箱函数 Matlab 图像处理工具箱函数是 Matlab 语言中的一组专门用于图像处理的函数库,包含了大部分常用的图像处理函数。下面将对这些函数进行详细的分类和介绍。 通用函数 Matlab 图像处理...

    opencv图像处理工具集

    **OpenCV 图像处理工具集详解** OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的函数和模块,用于处理图像和视频数据。这个工具集集成了多种功能,包括相机标定、角点检测...

    Python图像处理.pdf

    PythonWare 公司提供了免费的图像处理工具包 PIL(Python Image Library),该软件包提供了基本的图像处理功能,如改变图像大小、旋转图像、图像格式转换、色场空间转换、图像增强、直方图处理、插值和滤波等等。...

Global site tag (gtag.js) - Google Analytics