• 对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作


    对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作

      1 /**
      2  * <html>
      3  * <body>
      4  *  <P> Copyright 1994 JsonInternational</p>
      5  *  <p> All rights reserved.</p>
      6  *  <p> Created on 19941115</p>
      7  *  <p> Created by Jason</p>
      8  *  </body>
      9  * </html>
     10  */
     11 package cn.ucaner.alpaca.framework.utils.image;
     12 
     13 import java.awt.AlphaComposite;
     14 import java.awt.Color;
     15 import java.awt.Font;
     16 import java.awt.Graphics2D;
     17 import java.awt.Image;
     18 import java.awt.color.ColorSpace;
     19 import java.awt.image.BufferedImage;
     20 import java.awt.image.ColorConvertOp;
     21 import java.io.File;
     22 import java.io.FileInputStream;
     23 import java.io.IOException;
     24 
     25 import javax.imageio.ImageIO;
     26 
     27 /**
     28 * @Package:cn.ucaner.common.utils.image   
     29 * @ClassName:ImageUtil   
     30 * @Description:   <p> 对图片进行压缩,水印,伸缩变换,透明处理,格式转换操作 </p>
     31 * @Author: - Jason 
     32 * @CreatTime:2017年10月26日 上午10:52:22   
     33 * @Modify By:   
     34 * @ModifyTime:  
     35 * @Modify marker:   
     36 * @version    V1.0
     37  */
     38 public class ImageUtil {
     39 
     40     public static final float DEFAULT_QUALITY = 0.2125f ;
     41     
     42     /**
     43      * 添加图片水印操作(物理存盘,使用默认格式)
     44      * @param imgPath  待处理图片
     45      * @param markPath 水印图片
     46      * @param x 水印位于图片左上角的 x 坐标值
     47      * @param y 水印位于图片左上角的 y 坐标值
     48      * @param alpha  水印透明度 0.1f ~ 1.0f
     49      * @param destPath  文件存放路径  
     50      * @throws Exception          
     51      * 
     52      */
     53      public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String destPath) throws Exception{
     54          try {
     55                 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
     56                 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
     57             } catch (Exception e) {
     58                 throw new RuntimeException("添加图片水印异常");
     59             }
     60      }
     61     
     62         
     63     /**
     64      * 添加图片水印操作(物理存盘,自定义格式)
     65      * @param imgPath 待处理图片
     66      * @param markPath 水印图片
     67      * @param x 水印位于图片左上角的 x 坐标值
     68      * @param y 水印位于图片左上角的 y 坐标值
     69      * @param alpha 水印透明度 0.1f ~ 1.0f
     70      * @param format  添加水印后存储的格式
     71      * @param destPath  文件存放路径  
     72      * @throws Exception          
     73      * 
     74      */
     75      public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String format,String destPath) throws Exception{
     76          try {
     77                 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
     78                 ImageIO.write(bufferedImage,format , new File(destPath));
     79             } catch (Exception e) {
     80                 throw new RuntimeException("添加图片水印异常");
     81             }
     82      }
     83     
     84      
     85     /**
     86      * 添加图片水印操作,返回BufferedImage对象
     87      * @param imgPath 待处理图片
     88      * @param markPath 水印图片
     89      * @param x 水印位于图片左上角的 x 坐标值
     90      * @param y 水印位于图片左上角的 y 坐标值
     91      * @param alpha 水印透明度 0.1f ~ 1.0f
     92      * @return 处理后的图片对象
     93      * @throws Exception          
     94      * 
     95      */
     96     public static BufferedImage addWaterMark(String imgPath, String markPath, int x, int y, float alpha) throws Exception{
     97         BufferedImage targetImage = null;
     98         try {
     99                         // 加载待处理图片文件
    100             Image img = ImageIO.read(new File(imgPath));
    101 
    102                         //创建目标图象文件
    103             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    104             Graphics2D g = targetImage.createGraphics();
    105             g.drawImage(img, 0, 0, null);
    106             
    107                         // 加载水印图片文件
    108             Image markImg = ImageIO.read(new File(markPath));
    109             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    110             g.drawImage(markImg, x, y, null);
    111             g.dispose();
    112         } catch (Exception e) {
    113             throw new RuntimeException("添加图片水印操作异常");
    114         }
    115         return targetImage;
    116        
    117     }
    118 
    119     /**
    120      * 添加文字水印操作(物理存盘,使用默认格式)
    121      * @param imgPath 待处理图片
    122      * @param text 水印文字    
    123      * @param font 水印字体信息    不写默认值为宋体
    124      * @param color 水印字体颜色
    125      * @param x 水印位于图片左上角的 x 坐标值
    126      * @param y 水印位于图片左上角的 y 坐标值
    127      * @param alpha 水印透明度 0.1f ~ 1.0f
    128      * @param format 添加水印后存储的格式
    129      * @param destPath  文件存放路径     
    130      * @throws Exception          
    131      */
    132     public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String destPath) throws Exception{
    133         try {
    134             BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
    135             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    136         } catch (Exception e) {
    137             throw new RuntimeException("图片添加文字水印异常");
    138         }
    139     }
    140     
    141     /**
    142      * 添加文字水印操作(物理存盘,自定义格式)
    143      * @param imgPath  待处理图片
    144      * @param text 水印文字    
    145      * @param font 水印字体信息    不写默认值为宋体
    146      * @param color 水印字体颜色
    147      * @param x 水印位于图片左上角的 x 坐标值
    148      * @param y  水印位于图片左上角的 y 坐标值
    149      * @param alpha 水印透明度 0.1f ~ 1.0f
    150      * @param format 添加水印后存储的格式
    151      * @param destPath 文件存放路径     
    152      * @throws Exception          
    153      */
    154     public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String format,String destPath) throws Exception{
    155         try {
    156             BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
    157             ImageIO.write(bufferedImage, format, new File(destPath));
    158         } catch (Exception e) {
    159             throw new RuntimeException("图片添加文字水印异常");
    160         }
    161     }
    162     
    163     /**
    164      * 添加文字水印操作,返回BufferedImage对象
    165      * @param imgPath  待处理图片
    166      * @param text 水印文字    
    167      * @param font 水印字体信息    不写默认值为宋体
    168      * @param color 水印字体颜色
    169      * @param x  水印位于图片左上角的 x 坐标值
    170      * @param y 水印位于图片左上角的 y 坐标值
    171      * @param alpha 水印透明度 0.1f ~ 1.0f
    172      * @return  处理后的图片对象
    173      * @throws Exception          
    174      */
    175 
    176     public static BufferedImage addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha) throws Exception{
    177         BufferedImage targetImage = null;
    178         try {
    179             Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;    
    180             Image img = ImageIO.read(new File(imgPath));
    181                         //创建目标图像文件
    182             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    183             Graphics2D g = targetImage.createGraphics();
    184             g.drawImage(img, 0, 0, null);
    185             g.setColor(color);
    186             g.setFont(Dfont);
    187             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    188             g.drawString(text, x, y);
    189             g.dispose();
    190         } catch (Exception e) {
    191             throw new RuntimeException("添加文字水印操作异常");
    192         }
    193         return targetImage;
    194     }
    195     
    196     /**
    197      * 压缩图片操作(文件物理存盘,使用默认格式)
    198      * @param imgPath  待处理图片
    199      * @param quality  图片质量(0-1之間的float值)
    200      * @param width  输出图片的宽度    输入负数参数表示用原来图片宽
    201      * @param height  输出图片的高度    输入负数参数表示用原来图片高
    202      * @param autoSize  是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    203      * @param format 压缩后存储的格式
    204      * @param destPath 文件存放路径
    205      * 
    206      * @throws Exception
    207      */
    208     public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String destPath)throws Exception{
    209         try {
    210             BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
    211             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    212         } catch (Exception e) {
    213             throw new RuntimeException("图片压缩异常");
    214         }
    215         
    216     }
    217     
    218     /**
    219      * 压缩图片操作(文件物理存盘,可自定义格式)
    220      * @param imgPath 待处理图片
    221      * @param quality  图片质量(0-1之間的float值)
    222      * @param width 输出图片的宽度    输入负数参数表示用原来图片宽
    223      * @param height   输出图片的高度    输入负数参数表示用原来图片高
    224      * @param autoSize  是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    225      * @param format   压缩后存储的格式
    226      * @param destPath  文件存放路径
    227      * 
    228      * @throws Exception
    229      */
    230     public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String format,String destPath)throws Exception{
    231         try {
    232             BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
    233             ImageIO.write(bufferedImage, format, new File(destPath));
    234         } catch (Exception e) {
    235             throw new RuntimeException("图片压缩异常");
    236         }
    237     }
    238     
    239     
    240     /**
    241      * 压缩图片操作,返回BufferedImage对象
    242      * @param imgPath 待处理图片
    243      * @param quality 图片质量(0-1之間的float值)
    244      * @param width  输出图片的宽度    输入负数参数表示用原来图片宽
    245      * @param height 输出图片的高度    输入负数参数表示用原来图片高
    246      * @param autoSize  是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    247      * @return 处理后的图片对象
    248      * @throws Exception
    249      */
    250     public static BufferedImage compressImage(String imgPath,float quality,int width, int height, boolean autoSize)throws Exception{
    251         BufferedImage targetImage = null;
    252         if(quality<0F||quality>1F){
    253             quality = DEFAULT_QUALITY;
    254         }
    255         try {
    256             Image img = ImageIO.read(new File(imgPath));
    257                         //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
    258             int newwidth =( width > 0 ) ? width : img.getWidth(null);
    259                         //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
    260             int newheight = ( height > 0 )? height: img.getHeight(null);    
    261                         //如果是自适应大小则进行比例缩放
    262             if(autoSize){                                                    
    263                         // 为等比缩放计算输出的图片宽度及高度
    264                 double Widthrate = ((double) img.getWidth(null)) / (double) width + 0.1;
    265                 double heightrate = ((double) img.getHeight(null))/ (double) height + 0.1;
    266                 double rate = Widthrate > heightrate ? Widthrate : heightrate;
    267                 newwidth = (int) (((double) img.getWidth(null)) / rate);
    268                 newheight = (int) (((double) img.getHeight(null)) / rate);
    269             }
    270                         //创建目标图像文件
    271             targetImage = new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
    272             Graphics2D g = targetImage.createGraphics();
    273             g.drawImage(img, 0, 0, newwidth, newheight, null);
    274                         //如果添加水印或者文字则继续下面操作,不添加的话直接返回目标文件----------------------
    275             g.dispose();
    276             
    277         } catch (Exception e) {
    278             throw new RuntimeException("图片压缩操作异常");
    279         }
    280         return targetImage;
    281     }
    282     
    283     /**
    284      * 图片黑白化操作(文件物理存盘,使用默认格式)
    285      * @param bufferedImage 处理的图片对象
    286      * @param destPath 目标文件地址
    287      * @throws Exception  
    288      *
    289      */
    290     public static void imageGray(String imgPath, String destPath)throws Exception{
    291         imageGray(imgPath, imageFormat(imgPath), destPath);
    292     }
    293     
    294     
    295     /**
    296      * 图片黑白化操作(文件物理存盘,可自定义格式)
    297      * @param bufferedImage 处理的图片对象
    298      * @param format  图片格式
    299      * @param destPath  目标文件地址
    300      * @throws Exception 
    301      * 
    302      */
    303     public static void imageGray(String imgPath,String format, String destPath)throws Exception{
    304         try {
    305              BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
    306              ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);            
    307              ColorConvertOp op = new ColorConvertOp(cs, null);  
    308              bufferedImage = op.filter(bufferedImage, null);
    309              ImageIO.write(bufferedImage, format , new File(destPath));
    310         } catch (Exception e) {
    311             throw new RuntimeException("图片灰白化异常");
    312         }
    313     }
    314     
    315     
    316     
    317     /**
    318      * 图片透明化操作(文件物理存盘,使用默认格式)
    319      * @param imgPath  图片路径
    320      * @param destPath  图片存放路径
    321      * @throws Exception
    322      */
    323     public static void imageLucency(String imgPath,String destPath)throws Exception{
    324         try {
    325             BufferedImage bufferedImage = imageLucency(imgPath);
    326             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    327         } catch (Exception e) {
    328             throw new RuntimeException("图片透明化异常");
    329         }
    330     }
    331     
    332     
    333     /**
    334      * 图片透明化操作(文件物理存盘,可自定义格式)
    335      * @param imgPath  图片路径
    336      * @param format 图片格式
    337      * @param destPath  图片存放路径
    338      * @throws Exception
    339      */
    340     public static void imageLucency(String imgPath,String format,String destPath)throws Exception{
    341         try {
    342             BufferedImage bufferedImage = imageLucency(imgPath);
    343             ImageIO.write(bufferedImage, format, new File(destPath));
    344         } catch (Exception e) {
    345             throw new RuntimeException("图片透明化异常");
    346         }
    347     }
    348     
    349     /**
    350      * 图片透明化操作返回BufferedImage对象
    351      * @param imgPath  图片路径
    352      * @return 透明化后的图片对象
    353      * @throws Exception 
    354      */
    355     public static BufferedImage imageLucency(String imgPath)throws Exception{
    356         BufferedImage targetImage = null;
    357         try {
    358                         //读取图片   
    359             BufferedImage img = ImageIO.read(new FileInputStream(imgPath));
    360                         //透明度
    361             int alpha = 0;    
    362                         //执行透明化
    363             executeRGB(img, alpha);
    364             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    365             Graphics2D g = targetImage.createGraphics();
    366             g.drawImage(img, 0, 0, null);
    367             g.dispose();
    368         } catch (Exception e) {
    369             throw new RuntimeException("图片透明化执行异常");
    370         }
    371         return targetImage;
    372     }
    373     
    374     /**
    375      * 执行透明化的核心算法
    376      * @param img 图片对象
    377      * @param alpha   透明度
    378      * @throws Exception 
    379      */
    380     public static  void executeRGB(BufferedImage img, int alpha) throws Exception{
    381         int rgb = 0;//RGB值
    382                     //x表示BufferedImage的x坐标,y表示BufferedImage的y坐标
    383         for(int x=img.getMinX();x<img.getWidth();x++){
    384             for(int y=img.getMinY();y<img.getHeight();y++){
    385                      //获取点位的RGB值进行比较重新设定
    386                 rgb = img.getRGB(x, y); 
    387                 int R =(rgb & 0xff0000 ) >> 16 ; 
    388                 int G= (rgb & 0xff00 ) >> 8 ; 
    389                 int B= (rgb & 0xff ); 
    390                 if(((255-R)<30) && ((255-G)<30) && ((255-B)<30)){ 
    391                     rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff); 
    392                     img.setRGB(x, y, rgb);
    393                 }
    394             }
    395         }
    396     }
    397     
    398     
    399     /**
    400      * 图片格式转化操作(文件物理存盘)
    401      * @param imgPath    原始图片存放地址
    402      * @param format 待转换的格式 jpeg,gif,png,bmp等
    403      * @param destPath  目标文件地址
    404      * @throws Exception
    405      */
    406     public static void formatConvert(String imgPath, String format, String destPath)throws Exception{
    407         try {
    408             BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
    409             ImageIO.write(bufferedImage, format, new File(destPath));
    410         } catch (IOException e) {
    411             throw new RuntimeException("文件格式转换出错");
    412         }
    413     }
    414     
    415     /**
    416      * 图片格式转化操作返回BufferedImage对象
    417      * @param bufferedImage  BufferedImage图片转换对象
    418      * @param format  待转换的格式 jpeg,gif,png,bmp等
    419      * @param destPath   目标文件地址
    420      * @throws Exception
    421      */
    422     public static void formatConvert(BufferedImage bufferedImag, String format, String destPath)throws Exception{
    423         try {
    424             ImageIO.write(bufferedImag, format, new File(destPath));
    425         } catch (IOException e) {
    426             throw new RuntimeException("文件格式转换出错");
    427         }
    428     }
    429     
    430     
    431     /**
    432      * 获取图片文件的真实格式信息
    433      * @param imgPath   图片原文件存放地址
    434      * @return 图片格式
    435      * @throws Exception
    436      */
    437     public static String imageFormat(String imgPath)throws Exception{
    438         String[] filess = imgPath.split("\\");
    439         String[] formats = filess[filess.length - 1].split("\.");
    440         return formats[formats.length - 1];
    441      }
    442     
    443     /**
    444      * For Test By Jason
    445      */
    446     public static void main(String[] args) {
    447         
    448     }
    449 
    450 }
  • 相关阅读:
    【安徽集训】fiend
    【安徽集训】Emerald
    【安徽集训】Entropy
    【安徽集训】字符串
    【福建集训】果树
    【CF335 E】Counting Skyscrapers
    【BZOJ 3514】Codechef MARCH14 GERALD07 加强版
    【未知来源】Randomized Binary Search Tree
    【ZJOI 2016】旅行者
    【AGC002 E】Candy Piles
  • 原文地址:https://www.cnblogs.com/jasonandy/p/9184823.html
Copyright © 2020-2023  润新知