图片处理工具类
在实际项目中,我们经常会遇到处理各种各样的图片问题。 比如:图片的旋转、缩放、图片格式转换、获取图片类型、验证图片大小、写入图片 等。 这里我们使用java.awt.Graphics2D来实现常用图像处理的功能,形成我们的图像处理工具类。
1 package com.zhangsx.util.image; 2 import java.util.Iterator; 3 import java.awt.Graphics2D; 4 import java.awt.RenderingHints; 5 import java.awt.image.BufferedImage; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.io.ByteArrayInputStream; 9 import java.io.ByteArrayOutputStream; 10 import javax.imageio.ImageIO; 11 import javax.imageio.ImageReader; 12 import javax.imageio.stream.ImageInputStream; 13 /** 14 * 图像处理工具类。 15 * 16 * @version 1.00 2010-1-15 17 * @since 1.5 18 * @author ZhangShixi 19 */ 20 public class ImageUtil { 21 /** 22 * 旋转图像。 23 * @param bufferedImage 图像。 24 * @param degree 旋转角度。 25 * @return 旋转后的图像。 26 */ 27 public static BufferedImage rotateImage( 28 final BufferedImage bufferedImage, final int degree) { 29 int width = bufferedImage.getWidth(); 30 int height = bufferedImage.getHeight(); 31 int type = bufferedImage.getColorModel().getTransparency(); 32 BufferedImage image = new BufferedImage(width, height, type); 33 Graphics2D graphics2D = image.createGraphics(); 34 graphics2D.setRenderingHint( 35 RenderingHints.KEY_INTERPOLATION, 36 RenderingHints.VALUE_INTERPOLATION_BILINEAR); 37 graphics2D.rotate(Math.toRadians(degree), width / 2, height / 2); 38 graphics2D.drawImage(bufferedImage, 0, 0, null); 39 try { 40 return image; 41 } finally { 42 if (graphics2D != null) { 43 graphics2D.dispose(); 44 } 45 } 46 } 47 /** 48 * 将图像按照指定的比例缩放。 49 * 比如需要将图像放大20%,那么调用时scale参数的值就为20;如果是缩小,则scale值为-20。 50 * @param bufferedImage 图像。 51 * @param scale 缩放比例。 52 * @return 缩放后的图像。 53 */ 54 public static BufferedImage resizeImageScale( 55 final BufferedImage bufferedImage, final int scale) { 56 if (scale == 0) { 57 return bufferedImage; 58 } 59 int width = bufferedImage.getWidth(); 60 int height = bufferedImage.getHeight(); 61 int newWidth = 0; 62 int newHeight = 0; 63 double nowScale = (double) Math.abs(scale) / 100; 64 if (scale > 0) { 65 newWidth = (int) (width * (1 + nowScale)); 66 newHeight = (int) (height * (1 + nowScale)); 67 } else if (scale < 0) { 68 newWidth = (int) (width * (1 - nowScale)); 69 newHeight = (int) (height * (1 - nowScale)); 70 } 71 return resizeImage(bufferedImage, newWidth, newHeight); 72 } 73 /** 74 * 将图像缩放到指定的宽高大小。 75 * @param bufferedImage 图像。 76 * @param width 新的宽度。 77 * @param height 新的高度。 78 * @return 缩放后的图像。 79 */ 80 public static BufferedImage resizeImage( 81 final BufferedImage bufferedImage, 82 final int width, final int height) { 83 int type = bufferedImage.getColorModel().getTransparency(); 84 BufferedImage image = new BufferedImage(width, height, type); 85 Graphics2D graphics2D = image.createGraphics(); 86 graphics2D.setRenderingHint( 87 RenderingHints.KEY_INTERPOLATION, 88 RenderingHints.VALUE_INTERPOLATION_BILINEAR); 89 graphics2D.drawImage(bufferedImage, 0, 0, width, height, 0, 0, 90 bufferedImage.getWidth(), bufferedImage.getHeight(), null); 91 try { 92 return image; 93 } finally { 94 if (graphics2D != null) { 95 graphics2D.dispose(); 96 } 97 } 98 } 99 /** 100 * 将图像水平翻转。 101 * @param bufferedImage 图像。 102 * @return 翻转后的图像。 103 */ 104 public static BufferedImage flipImage( 105 final BufferedImage bufferedImage) { 106 int width = bufferedImage.getWidth(); 107 int height = bufferedImage.getHeight(); 108 int type = bufferedImage.getColorModel().getTransparency(); 109 BufferedImage image = new BufferedImage(width, height, type); 110 Graphics2D graphics2D = image.createGraphics(); 111 graphics2D.drawImage(bufferedImage, 0, 0, width, height, 112 width, 0, 0, height, null); 113 try { 114 return image; 115 } finally { 116 if (graphics2D != null) { 117 graphics2D.dispose(); 118 } 119 } 120 } 121 /** 122 * 获取图片的类型。如果是 gif、jpg、png、bmp 以外的类型则返回null。 123 * @param imageBytes 图片字节数组。 124 * @return 图片类型。 125 * @throws java.io.IOException IO异常。 126 */ 127 public static String getImageType(final byte[] imageBytes) 128 throws IOException { 129 ByteArrayInputStream input = new ByteArrayInputStream(imageBytes); 130 ImageInputStream imageInput = ImageIO.createImageInputStream(input); 131 Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInput); 132 String type = null; 133 if (iterator.hasNext()) { 134 ImageReader reader = iterator.next(); 135 type = reader.getFormatName().toUpperCase(); 136 } 137 try { 138 return type; 139 } finally { 140 if (imageInput != null) { 141 imageInput.close(); 142 } 143 } 144 } 145 /** 146 * 验证图片大小是否超出指定的尺寸。未超出指定大小返回true,超出指定大小则返回false。 147 * @param imageBytes 图片字节数组。 148 * @param width 图片宽度。 149 * @param height 图片高度。 150 * @return 验证结果。未超出指定大小返回true,超出指定大小则返回false。 151 * @throws java.io.IOException IO异常。 152 */ 153 public static boolean checkImageSize( 154 final byte[] imageBytes, final int width, final int height) 155 throws IOException { 156 BufferedImage image = byteToImage(imageBytes); 157 int sourceWidth = image.getWidth(); 158 int sourceHeight = image.getHeight(); 159 if (sourceWidth > width || sourceHeight > height) { 160 return false; 161 } else { 162 return true; 163 } 164 } 165 /** 166 * 将图像字节数组转化为BufferedImage图像实例。 167 * @param imageBytes 图像字节数组。 168 * @return BufferedImage图像实例。 169 * @throws java.io.IOException IO异常。 170 */ 171 public static BufferedImage byteToImage( 172 final byte[] imageBytes) throws IOException { 173 ByteArrayInputStream input = new ByteArrayInputStream(imageBytes); 174 BufferedImage image = ImageIO.read(input); 175 try { 176 return image; 177 } finally { 178 if (input != null) { 179 input.close(); 180 } 181 } 182 } 183 /** 184 * 将BufferedImage持有的图像转化为指定图像格式的字节数组。 185 * @param bufferedImage 图像。 186 * @param formatName 图像格式名称。 187 * @return 指定图像格式的字节数组。 188 * @throws java.io.IOException IO异常。 189 */ 190 public static byte[] imageToByte( 191 final BufferedImage bufferedImage, final String formatName) 192 throws IOException { 193 ByteArrayOutputStream output = new ByteArrayOutputStream(); 194 ImageIO.write(bufferedImage, formatName, output); 195 try { 196 return output.toByteArray(); 197 } finally { 198 if (output != null) { 199 output.close(); 200 } 201 } 202 } 203 /** 204 * 将图像以指定的格式进行输出,调用者需自行关闭输出流。 205 * @param bufferedImage 图像。 206 * @param output 输出流。 207 * @param formatName 图片格式名称。 208 * @throws java.io.IOException IO异常。 209 */ 210 public static void writeImage(final BufferedImage bufferedImage, 211 final OutputStream output, final String formatName) 212 throws IOException { 213 ImageIO.write(bufferedImage, formatName, output); 214 } 215 /** 216 * 将图像以指定的格式进行输出,调用者需自行关闭输出流。 217 * @param imageBytes 图像的byte数组。 218 * @param output 输出流。 219 * @param formatName 图片格式名称。 220 * @throws java.io.IOException IO异常。 221 */ 222 public static void writeImage(final byte[] imageBytes, 223 final OutputStream output, final String formatName) 224 throws IOException { 225 BufferedImage image = byteToImage(imageBytes); 226 ImageIO.write(image, formatName, output); 227 } 228 }