首页 > 代码库 > 图片处理工具类
图片处理工具类
在实际项目中,我们经常会遇到处理各种各样的图片问题。 比如:图片的旋转、缩放、图片格式转换、获取图片类型、验证图片大小、写入图片 等。 这里我们使用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 }
图片处理工具类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。