图像处理工具类

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

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

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

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