图像工具类

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

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

Java代码   复制代码   收藏代码
  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. }

你可能感兴趣的:(图像工具类)