一、几个处理图片时的关键类

Image、BufferedImage、Graphics、Graphics2D、Shape、Color、ImageIo、ImageInputStream

下面逐个介绍上述几个类

(一)、图像类

1.1、Image

抽象类 Image 是表示图形图像的所有类的超类。必须以特定于平台的方式获取图像

1.2、BufferedImage

BufferedImage 子类描述具有可访问图像数据缓冲区的 Image BufferedImage 由图像数据的ColorModel 相匹配,以表示其颜色和 alpha 分量。所有 BufferedImage 对象的左上角坐标都为 (0, 0)。因此,用来构造 BufferedImage 的任何 Raster 都必须满足:minX=0 且 minY=0。
常用方法:

1.2.1、BufferedImage(int width, int height, int imageType)
参数:
width - 所创建图像的宽度
height - 所创建图像的高度
imageType - 所创建图像的类型  这里举几个例子: TYPE_BYTE_BINARY  二
值化(黑白)、TYPE_BYTE_GRAY 灰度化、TYPE_INT_RGB 彩色

构造一个类型为预定义图像类型之一的 BufferedImage。

1.2.2、public Graphics getGraphics()

此方法返回 Graphics2D,但此处是出于向后兼容性的考虑。 createGraphics 更为方便,因为它被声明为返回 Graphics2D。

1.2.3、getHeight()

此方法返回图片的高度

1.2.4、int getMinX()

返回此 BufferedImage 的最小 x 坐标。

1.2.5、int getMinY()

返回此 BufferedImage 的最小 y 坐标。

1.2.6、public int getType()

返回图像类型。如果它不是已知的类型之一,则返回 TYPE_CUSTOM 。

1.2.7、int getWidth()

返回 BufferedImage 的宽度。

1.2.8、public BufferedImage getSubimage(int x,int y,int w,int h)

返回由指定矩形区域定义的子图像。返回的 BufferedImage 与源图像共享相同的数据数组。
参数:
x - 指定矩形区域左上角的 X 坐标
y - 指定矩形区域左上角的 Y 坐标
w - 指定矩形区域的宽度
h - 指定矩形区域的高度

1.2.9、public Image getScaledInstance(int width,int height,int hints)

创建此图像的缩放版本。返回一个新的 Image 对象,默认情况下,该对象按指定的 width 和 height 呈现图像。即使已经完全加载了初始源图像,新的 Image 对象也可以被异步加载。如果 width 或 height 为负数,则替换该值以维持初始图像尺寸的高宽比。如果 width 和 height 都为负,则使用初始图像尺寸。

参数:
width - 将图像缩放到的宽度。
height - 将图像缩放到的高度。
hints - 指示用于图像重新取样的算法类型的标志。

(二)绘图类

2.1、Graphics

Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制
常用方法

2.1.1、public abstract boolean drawImage(Image img,int x,int y,ImageObserver observer)

绘制指定图像中当前可用的图像。图像的左上角位于该图形上下文坐标空间的 ( x, y)。图像中的透明像素不影响该处已存在的像素。

img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。
x - x 坐标。
y - y 坐标。
observer - 转换了更多图像时要通知的对象。

2.2、Graphics2D

此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。

常用方法:

2.2.1、protected Graphics2D()

构建一个新的 Graphics2D 对象。

2.2.2、public abstract void drawString(String str,float x,float y)

使用 Graphics2D 上下文中当前文本属性状态呈现由指定 String 指定的文本。首字符的基线位于用户空间中的( x, y) 位置处。应用的呈现属性包括 Clip、 Transform、 Paint、 Font Composite 属性。对于脚本系统(如 Hebrew 和 Arabic)中的字符,在提供的坐标位于基线上最左边字符的情况下,可以从右到左呈现字形。

2.2.3、abstract void fill(Shape s)

使用 Graphics2D 上下文的设置,填充 Shape 的内部区域。

2.2.4、abstract void rotate(double theta)

旋转

2.2.5、abstract void translate(double tx, double ty)

平移

参数:
tx - 沿 x 轴平移的距离
ty - 沿 y 轴平移的距离
2.2.6、abstract void scale(double sx, double sy)

缩放

参数:
sx - 相对于以前的呈现操作,后续呈现操作中的与 X 坐标相乘的量。(缩放倍数)
sy - 相对于以前的呈现操作,后续呈现操作中的与 Y 坐标相乘的量。(缩放倍数)
2.2.7、abstract void setBackground(Color color)

设置 Graphics2D 上下文的背景色。

2.2.8、public abstract void shear(double shx,double shy)

裁剪

2.2.9、public abstract void dispose()

释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。Java 程序运行时,可以在一个短时间帧内创建大量的 Graphics 对象。尽管垃圾回收器的终止进程也能够进行相同的系统资源释放,但是最好通过调用此方法来手工释放相关资源,而不是依靠终止进程,因为终止进程需要很长时间才能结束运行。作为组件 paint 和 update 方法的参数提供的 Graphics 对象,在这些方法返回时将被系统自动释放。为了提高效率,仅当所使用的 Graphics 对象是由组件或另一个 Graphics 对象直接创建时,程序员才应在使用完此Graphics 后调用 dispose。

2.3 Shape

Shape 接口提供了表示一些几何形状的对象的定义。

2.4 Color

Color 类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由 ColorSpace 标识的任意颜色空间中的颜色。每种颜色都有一个隐式的 alpha 值 1.0,或者有一个在构造方法中提供的显式的 alpha 值。alpha 值定义了颜色的透明度,可用一个在 0.0 - 1.0 或 0 - 255 范围内的浮点值表示它。alpha 值为 1.0 或 255 则意味着颜色完全是不透明的,alpha 值为 0 或 0.0 则意味着颜色是完全透明的。在使用显式的 alpha 值构造 Color 时,或者在获取某个 Color 的颜色/alpha 分量时,从不将颜色分量预乘 alpha 分量。

(三)、流处理类

3.1 ImageIo

该类包含一些用来查找 ImageReader 和 ImageWriter 以及执行简单编码和解码的静态便捷方法
常用方法:

3.1.1、public static ImageInputStream createImageInputStream(Object input) throws IOException

返回一个 ImageInputStream,它将从给定 Object 中获取输入

参数:
input - 用作输入源的 Object,比如 File、可读取的 RandomAccessFile 或 InputStream。
3.1.2、public static ImageOutputStream createImageOutputStream(Object output) throws IOException

返回一个 ImageOutputStream,它将其输出发送到给定 Object。

参数:
output - 用作输出目标的 Object,比如 File、可写入的 RandomAccessFile 或 OutputStream。
3.1.3、static Iterator< ImageReader > getImageReaders(Object input)

返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码所提供的 Object(通常是一个 ImageInputStream)。

3.1.4、static Iterator< ImageReader > getImageReadersByFormatName(String formatName)

方法返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。

参数:
formatName - 包含非正式格式名称的 String( 例如 "jpeg" 或 "tiff")
3.1.5、几个read方法
1、public static BufferedImage read(File input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 File 的结果。该 File 被包装在一个 ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

2、public static BufferedImage read(InputStream input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 InputStream 的结果。该 InputStream 被包装在一个 ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

3、public static BufferedImage read(URL input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 URL 的结果。InputStream是从 URL 中获得的,它被包装ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

4、public static BufferedImage read(ImageInputStream stream)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 ImageInputStream 的结果。如果没有已注册的 ImageReader 声称能够读取该流,则返回 null。

3.1.6、setUseCache(boolean useCache)

设置一个标记,指示在创建 ImageInputStream 和 ImageOutputStream 时是否应该使用基于磁盘的缓存文件。

3.1.7、public static void setCacheDirectory(File cacheDirectory)

设置将在其中创建缓存文件的目录。值为 null 表示将使用与系统有关的默认临时文件目录。如果
getUseCache 返回 false,则忽略此值。

3.1.8、三个write方法
1、static boolean write(RenderedImage im, String formatName, File output)

使用支持给定格式的任意 ImageWriter 将一个图像写入 File。

2、static boolean write(RenderedImage im, String formatName, ImageOutputStream output)

使用支持给定格式的任意 ImageWriter 将一个图像写入 ImageOutputStream。

3、static boolean write(RenderedImage im, String formatName, OutputStream output)

使用支持给定格式的任意 ImageWriter 将一个图像写入 OutputStream。

3.2、ImageInputStream

供 ImageReader 使用的可查找输入流接口。各种输入源(如 InputStream、File 以及将来的快速 I/O 源)都可以通过此接口的恰当实现进行“包装”,供 Image I/O API 使用。简言之,该接口是用于包装输入流(解码)。

二、图片操作工具类(持续完善中…)

package util;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

/**
 * @Description: 图片操作类
 * @author limouren
 * @date 2018年1月17日
 */
public class ImageUtil {
    public static final String IMAGE_TYPE_GIF = "gif";// 图形交换格式
    public static final String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组
    public static final String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组
    public static final String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式
    public static final String IMAGE_TYPE_PNG = "png";// 可移植网络图形
    public static final String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop

    /**
     * @Description: 按比例缩小或者放大图片
     * @param srcImage
     *            要缩小或者放大的图片
     * @param scale
     *            缩小或者放大的倍数
     * @param flag
     *            true表示放大;false表示缩小
     * @param formatName
     *            缩小后的图片格式(最好跟原图片格式相同),默认为jpeg
     * @return BufferedImage 缩小或者放大后的图片
     */
    public static BufferedImage multipleScale(BufferedImage srcImage,
            int scale, boolean flag, String formatName) throws Exception {
        if (null == srcImage) {
            return null;
        }
        if (scale <= 0) {
            return null;
        }
        if (null == formatName || "".equals(formatName)) {
            formatName = IMAGE_TYPE_JPEG;
        }

        int width = srcImage.getWidth(); // 得到源图宽
        int height = srcImage.getHeight(); // 得到源图长
        if (flag) {// 放大
            width = width * scale;
            height = height * scale;
        } else {// 缩小
            width = width / scale;
            height = height / scale;
        }

        Image image = srcImage.getScaledInstance(width, height,
                Image.SCALE_DEFAULT);
        BufferedImage tag = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = tag.createGraphics();
        g.drawImage(image, 0, 0, null); // 绘制缩小后的图
        g.dispose();
        tag.flush();
        return tag;
    }

    /**
     * @Description: 在(x,y)坐标处裁剪宽为width,高为height的图片。 若height或者width <0,返回null
     * @param srcImage
     * @param x
     * @param y
     * @param width
     * @param height
     * @return
     * @throws Exception
     */
    public static BufferedImage cut(BufferedImage srcImage, int x, int y,
            int width, int height) throws Exception {
        if (null != srcImage && srcImage.getHeight() > 0
                && srcImage.getWidth() > 0) {
            int srcWidth = srcImage.getHeight(); // 源图宽度
            int srcHeight = srcImage.getWidth(); // 源图高度
            Image image = srcImage.getScaledInstance(srcWidth, srcHeight,
                    Image.SCALE_DEFAULT);
            if (width <= 0 || height <= 0) {
                return null;
            }
            // 四个参数分别为图像起点坐标和宽高
            // 即: CropImageFilter(int x,int y,int width,int height)
            ImageFilter cropFilter = new CropImageFilter(x, y, width, height);
            Image img = Toolkit.getDefaultToolkit().createImage(
                    new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage tag = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图
            g.dispose();
            return tag;
        } else {
            return null;
        }
    }

    /**
     * @Description: 转换BufferedImage->输出流
     * @param image
     *            二维码内容
     * @param format
     *            图片格式
     * @param outPutStream
     *            如果不指定输出流,默认为ByteArrayOutputStream 输出流
     * @return
     * @throws IOException
     */
    public static OutputStream writeToStream(BufferedImage image,
            String format, OutputStream outPutStream) throws Exception {
        if (null == outPutStream) {
            outPutStream = new ByteArrayOutputStream();
        }
        ImageIO.write(image, format, outPutStream);
        return outPutStream;
    }

    /**
     * 图片输出到文件
     * 
     * @param image
     *            图片
     * @param format
     *            图片格式
     * @param file
     *            输出文件
     * @return
     * */
    public static File writeToFile(BufferedImage image, String format, File file)
            throws IOException {
        if (null == file) {
            return null;
        }
        ImageIO.write(image, format, file);
        return file;
    }

}