• 自己封装的一个Java版图片工具,具备压缩,伸缩变换,透明处理,格式转换等功能.


     

    网络传输过程中,为什么要对图像和视频流进行压缩
    第一,压缩的必要性:     

      图象和视频通常在计算机中表示后会占用非常大的空间,而出于节省硬盘空间的考虑,往往要进行压缩。同时,传输过程中,为了节省珍贵的带宽资源和节省时间,也迫切要求压缩。压缩之后,传输过程中的误码率也会相应地减少。

    第二,压缩的可能性:     

      人眼对颜色只有一定的感应能力,当某些颜色十分相近时,人是感觉不出差异的(或者很小)。这一点为压缩提供了机会。我们把相近的颜色用一种颜色表示,从而减少了图象的存储空间,实现压缩。同时,通过解压缩,我们可以根据之前采取的压缩方法(有损压缩、无损压缩等)进行相应的解压缩措施,保证图象的真度恢复。

    下面是个人封装的工具,具有用户自定义图片压缩水印(图片水印,文字水印)、图片透明处理、灰白处理、格式获取、格式转换、物理存储、处理中介BufferedImage等模块.

    代码全贴,含注释, 个人娱乐之作,不喜勿喷! 菜鸟一枚,求指点.

      1 package org.dennisit.org.util;
      2 import java.awt.AlphaComposite;
      3 import java.awt.Color;
      4 import java.awt.Font;
      5 import java.awt.Graphics2D;
      6 import java.awt.Image;
      7 import java.awt.color.ColorSpace;
      8 import java.awt.image.BufferedImage;
      9 import java.awt.image.ColorConvertOp;
     10 import java.io.ByteArrayInputStream;
     11 import java.io.File;
     12 import java.io.FileInputStream;
     13 import java.io.IOException;
     14 import java.util.Iterator;
     15 
     16 import javax.imageio.ImageIO;
     17 import javax.imageio.ImageReader;
     18 import javax.imageio.stream.MemoryCacheImageInputStream;
     19 
     20 import com.sun.imageio.plugins.bmp.BMPImageReader;
     21 import com.sun.imageio.plugins.gif.GIFImageReader;
     22 import com.sun.imageio.plugins.jpeg.JPEGImageReader;
     23 import com.sun.imageio.plugins.png.PNGImageReader;
     24 
     25 /**
     26  *
     27  *  @version : 1.1
     28  *  
     29  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
     30  *    
     31  *  @since     : 1.0        创建时间:    2012-12-28        上午11:15:03
     32  *     
     33  *  @function: 图片工具类
     34  *  
     35  *      
     36  *
     37  */
     38 
     39 public class PictureUtil {
     40 
     41     public static final float DEFAULT_QUALITY = 0.2125f ;
     42     
     43     
     44     /**
     45      * 
     46      * 添加图片水印操作(物理存盘,使用默认格式)
     47      * 
     48      * @param imgPath
     49      *            待处理图片
     50      * @param markPath
     51      *            水印图片
     52      * @param x
     53      *            水印位于图片左上角的 x 坐标值
     54      * @param y
     55      *            水印位于图片左上角的 y 坐标值
     56      * @param alpha
     57      *            水印透明度 0.1f ~ 1.0f
     58      * @param destPath
     59      *                 文件存放路径  
     60      * @throws Exception          
     61      * 
     62      */
     63      public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String destPath) throws Exception{
     64          try {
     65                 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
     66                 ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
     67             } catch (Exception e) {
     68                 throw new RuntimeException("添加图片水印异常");
     69             }
     70      }
     71     
     72         
     73     /**
     74      * 
     75      * 添加图片水印操作(物理存盘,自定义格式)
     76      * 
     77      * @param imgPath
     78      *            待处理图片
     79      * @param markPath
     80      *            水印图片
     81      * @param x
     82      *            水印位于图片左上角的 x 坐标值
     83      * @param y
     84      *            水印位于图片左上角的 y 坐标值
     85      * @param alpha
     86      *            水印透明度 0.1f ~ 1.0f
     87      * @param format
     88      *                 添加水印后存储的格式
     89      * @param destPath
     90      *                 文件存放路径  
     91      * @throws Exception          
     92      * 
     93      */
     94      public static void addWaterMark(String imgPath, String markPath, int x, int y, float alpha,String format,String destPath) throws Exception{
     95          try {
     96                 BufferedImage bufferedImage = addWaterMark(imgPath, markPath, x, y, alpha);
     97                 ImageIO.write(bufferedImage,format , new File(destPath));
     98             } catch (Exception e) {
     99                 throw new RuntimeException("添加图片水印异常");
    100             }
    101      }
    102     
    103      
    104     /**
    105      * 
    106      * 添加图片水印操作,返回BufferedImage对象
    107      * 
    108      * @param imgPath
    109      *            待处理图片
    110      * @param markPath
    111      *            水印图片
    112      * @param x
    113      *            水印位于图片左上角的 x 坐标值
    114      * @param y
    115      *            水印位于图片左上角的 y 坐标值
    116      * @param alpha
    117      *            水印透明度 0.1f ~ 1.0f
    118      * @return
    119      *                 处理后的图片对象
    120      * @throws Exception          
    121      * 
    122      */
    123     public static BufferedImage addWaterMark(String imgPath, String markPath, int x, int y, float alpha) throws Exception{
    124         BufferedImage targetImage = null;
    125         try {
    126                         // 加载待处理图片文件
    127             Image img = ImageIO.read(new File(imgPath));
    128 
    129                         //创建目标图象文件
    130             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    131             Graphics2D g = targetImage.createGraphics();
    132             g.drawImage(img, 0, 0, null);
    133             
    134                         // 加载水印图片文件
    135             Image markImg = ImageIO.read(new File(markPath));
    136             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    137             g.drawImage(markImg, x, y, null);
    138             g.dispose();
    139         } catch (Exception e) {
    140             throw new RuntimeException("添加图片水印操作异常");
    141         }
    142         return targetImage;
    143        
    144     }
    145 
    146    
    147     
    148     /**
    149      * 
    150      * 添加文字水印操作(物理存盘,使用默认格式)
    151      * 
    152      * @param imgPath
    153      *            待处理图片
    154      * @param text
    155      *            水印文字    
    156      * @param font
    157      *            水印字体信息    不写默认值为宋体
    158      * @param color
    159      *            水印字体颜色
    160      * @param x
    161      *            水印位于图片左上角的 x 坐标值
    162      * @param y
    163      *            水印位于图片左上角的 y 坐标值
    164      * @param alpha
    165      *            水印透明度 0.1f ~ 1.0f
    166      * @param format
    167      *                 添加水印后存储的格式
    168      * @param destPath
    169      *                 文件存放路径     
    170      * @throws Exception          
    171      */
    172     public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String destPath) throws Exception{
    173         try {
    174             BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
    175             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    176         } catch (Exception e) {
    177             throw new RuntimeException("图片添加文字水印异常");
    178         }
    179     }
    180     
    181     /**
    182      * 
    183      * 添加文字水印操作(物理存盘,自定义格式)
    184      * 
    185      * @param imgPath
    186      *            待处理图片
    187      * @param text
    188      *            水印文字    
    189      * @param font
    190      *            水印字体信息    不写默认值为宋体
    191      * @param color
    192      *            水印字体颜色
    193      * @param x
    194      *            水印位于图片左上角的 x 坐标值
    195      * @param y
    196      *            水印位于图片左上角的 y 坐标值
    197      * @param alpha
    198      *            水印透明度 0.1f ~ 1.0f
    199      * @param format
    200      *                 添加水印后存储的格式
    201      * @param destPath
    202      *                 文件存放路径     
    203      * @throws Exception          
    204      */
    205     public static void addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha,String format,String destPath) throws Exception{
    206         try {
    207             BufferedImage bufferedImage = addTextMark(imgPath, text, font, color, x, y, alpha);
    208             ImageIO.write(bufferedImage, format, new File(destPath));
    209         } catch (Exception e) {
    210             throw new RuntimeException("图片添加文字水印异常");
    211         }
    212     }
    213     
    214     /**
    215      * 
    216      * 添加文字水印操作,返回BufferedImage对象
    217      * 
    218      * @param imgPath
    219      *            待处理图片
    220      * @param text
    221      *            水印文字    
    222      * @param font
    223      *            水印字体信息    不写默认值为宋体
    224      * @param color
    225      *            水印字体颜色
    226      * @param x
    227      *            水印位于图片左上角的 x 坐标值
    228      * @param y
    229      *            水印位于图片左上角的 y 坐标值
    230      * @param alpha
    231      *            水印透明度 0.1f ~ 1.0f
    232      * @return
    233      *                 处理后的图片对象
    234      * @throws Exception          
    235      */
    236 
    237     public static BufferedImage addTextMark(String imgPath, String text, Font font, Color color, float x, float y, float alpha) throws Exception{
    238         BufferedImage targetImage = null;
    239         try {
    240             Font Dfont = (font == null) ? new Font("宋体", 20, 13) : font;    
    241             Image img = ImageIO.read(new File(imgPath));
    242                         //创建目标图像文件
    243             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    244             Graphics2D g = targetImage.createGraphics();
    245             g.drawImage(img, 0, 0, null);
    246             g.setColor(color);
    247             g.setFont(Dfont);
    248             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    249             g.drawString(text, x, y);
    250             g.dispose();
    251         } catch (Exception e) {
    252             throw new RuntimeException("添加文字水印操作异常");
    253         }
    254         return targetImage;
    255     }
    256     
    257     
    258     
    259     /**
    260      * 
    261      * 
    262      * 
    263      * 压缩图片操作(文件物理存盘,使用默认格式)
    264      * 
    265      * @param imgPath
    266      *                 待处理图片
    267      * @param quality
    268      *                 图片质量(0-1之間的float值)
    269      * @param width
    270      *                 输出图片的宽度    输入负数参数表示用原来图片宽
    271      * @param height
    272      *                 输出图片的高度    输入负数参数表示用原来图片高
    273      * @param autoSize
    274      *                 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    275      * @param format
    276      *                 压缩后存储的格式
    277      * @param destPath
    278      *                 文件存放路径
    279      * 
    280      * @throws Exception
    281      */
    282     public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String destPath)throws Exception{
    283         try {
    284             BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
    285             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    286         } catch (Exception e) {
    287             throw new RuntimeException("图片压缩异常");
    288         }
    289         
    290     }
    291     
    292     
    293     /**
    294      * 
    295      * 压缩图片操作(文件物理存盘,可自定义格式)
    296      * 
    297      * @param imgPath
    298      *                 待处理图片
    299      * @param quality
    300      *                 图片质量(0-1之間的float值)
    301      * @param width
    302      *                 输出图片的宽度    输入负数参数表示用原来图片宽
    303      * @param height
    304      *                 输出图片的高度    输入负数参数表示用原来图片高
    305      * @param autoSize
    306      *                 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    307      * @param format
    308      *                 压缩后存储的格式
    309      * @param destPath
    310      *                 文件存放路径
    311      * 
    312      * @throws Exception
    313      */
    314     public static void compressImage(String imgPath,float quality,int width, int height, boolean autoSize,String format,String destPath)throws Exception{
    315         try {
    316             BufferedImage bufferedImage = compressImage(imgPath, quality, width, height, autoSize);
    317             ImageIO.write(bufferedImage, format, new File(destPath));
    318         } catch (Exception e) {
    319             throw new RuntimeException("图片压缩异常");
    320         }
    321     }
    322     
    323     
    324     /**
    325      * 
    326      * 压缩图片操作,返回BufferedImage对象
    327      * 
    328      * @param imgPath
    329      *                 待处理图片
    330      * @param quality
    331      *                 图片质量(0-1之間的float值)
    332      * @param width
    333      *                 输出图片的宽度    输入负数参数表示用原来图片宽
    334      * @param height
    335      *                 输出图片的高度    输入负数参数表示用原来图片高
    336      * @param autoSize
    337      *                 是否等比缩放 true表示进行等比缩放 false表示不进行等比缩放
    338      * @return
    339      *                 处理后的图片对象
    340      * @throws Exception
    341      */
    342     public static BufferedImage compressImage(String imgPath,float quality,int width, int height, boolean autoSize)throws Exception{
    343         BufferedImage targetImage = null;
    344         if(quality<0F||quality>1F){
    345             quality = DEFAULT_QUALITY;
    346         }
    347         try {
    348             Image img = ImageIO.read(new File(imgPath));
    349                         //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
    350             int newwidth =( width > 0 ) ? width : img.getWidth(null);
    351                         //如果用户输入的图片参数合法则按用户定义的复制,负值参数表示执行默认值
    352             int newheight = ( height > 0 )? height: img.getHeight(null);    
    353                         //如果是自适应大小则进行比例缩放
    354             if(autoSize){                                                    
    355                         // 为等比缩放计算输出的图片宽度及高度
    356                 double Widthrate = ((double) img.getWidth(null)) / (double) width + 0.1;
    357                 double heightrate = ((double) img.getHeight(null))/ (double) height + 0.1;
    358                 double rate = Widthrate > heightrate ? Widthrate : heightrate;
    359                 newwidth = (int) (((double) img.getWidth(null)) / rate);
    360                 newheight = (int) (((double) img.getHeight(null)) / rate);
    361             }
    362                         //创建目标图像文件
    363             targetImage = new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
    364             Graphics2D g = targetImage.createGraphics();
    365             g.drawImage(img, 0, 0, newwidth, newheight, null);
    366                         //如果添加水印或者文字则继续下面操作,不添加的话直接返回目标文件----------------------
    367             g.dispose();
    368             
    369         } catch (Exception e) {
    370             throw new RuntimeException("图片压缩操作异常");
    371         }
    372         return targetImage;
    373     }
    374     
    375     
    376   
    377     /**
    378      * 图片黑白化操作(文件物理存盘,使用默认格式)
    379      * 
    380      * @param bufferedImage
    381      *                 处理的图片对象
    382      * @param destPath
    383      *                 目标文件地址
    384      * @throws Exception  
    385      *
    386      */
    387     public static void imageGray(String imgPath, String destPath)throws Exception{
    388         imageGray(imgPath, imageFormat(imgPath), destPath);
    389     }
    390     
    391     
    392     /**
    393      * 图片黑白化操作(文件物理存盘,可自定义格式)
    394      * 
    395      * @param bufferedImage
    396      *                 处理的图片对象
    397      * @param format
    398      *                 图片格式
    399      * @param destPath
    400      *                 目标文件地址
    401      * @throws Exception 
    402      * 
    403      */
    404     public static void imageGray(String imgPath,String format, String destPath)throws Exception{
    405         try {
    406              BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
    407              ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);            
    408              ColorConvertOp op = new ColorConvertOp(cs, null);  
    409              bufferedImage = op.filter(bufferedImage, null);
    410              ImageIO.write(bufferedImage, format , new File(destPath));
    411         } catch (Exception e) {
    412             throw new RuntimeException("图片灰白化异常");
    413         }
    414     }
    415     
    416     
    417     
    418     /**
    419      * 图片透明化操作(文件物理存盘,使用默认格式)
    420      * 
    421      * @param imgPath
    422      *                 图片路径
    423      * @param destPath
    424      *                 图片存放路径
    425      * @throws Exception
    426      */
    427     public static void imageLucency(String imgPath,String destPath)throws Exception{
    428         try {
    429             BufferedImage bufferedImage = imageLucency(imgPath);
    430             ImageIO.write(bufferedImage, imageFormat(imgPath), new File(destPath));
    431         } catch (Exception e) {
    432             throw new RuntimeException("图片透明化异常");
    433         }
    434     }
    435     
    436     
    437     /**
    438      * 图片透明化操作(文件物理存盘,可自定义格式)
    439      * 
    440      * @param imgPath
    441      *                 图片路径
    442      * @param format
    443      *                 图片格式
    444      * @param destPath
    445      *                 图片存放路径
    446      * @throws Exception
    447      */
    448     public static void imageLucency(String imgPath,String format,String destPath)throws Exception{
    449         try {
    450             BufferedImage bufferedImage = imageLucency(imgPath);
    451             ImageIO.write(bufferedImage, format, new File(destPath));
    452         } catch (Exception e) {
    453             throw new RuntimeException("图片透明化异常");
    454         }
    455     }
    456     
    457     /**
    458      * 图片透明化操作返回BufferedImage对象
    459      * 
    460      * @param imgPath
    461      *                 图片路径
    462      * @return
    463      *                 透明化后的图片对象
    464      * @throws Exception 
    465      */
    466     public static BufferedImage imageLucency(String imgPath)throws Exception{
    467         BufferedImage targetImage = null;
    468         try {
    469                         //读取图片   
    470             BufferedImage img = ImageIO.read(new FileInputStream(imgPath));
    471                         //透明度
    472             int alpha = 0;    
    473                         //执行透明化
    474             executeRGB(img, alpha);
    475             targetImage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    476             Graphics2D g = targetImage.createGraphics();
    477             g.drawImage(img, 0, 0, null);
    478             g.dispose();
    479         } catch (Exception e) {
    480             throw new RuntimeException("图片透明化执行异常");
    481         }
    482         return targetImage;
    483     }
    484     
    485     /**
    486      * 执行透明化的核心算法
    487      * 
    488      * @param img
    489      *                 图片对象
    490      * @param alpha
    491      *                 透明度
    492      * @throws Exception 
    493      */
    494     public static  void executeRGB(BufferedImage img, int alpha) throws Exception{
    495         int rgb = 0;//RGB值
    496                     //x表示BufferedImage的x坐标,y表示BufferedImage的y坐标
    497         for(int x=img.getMinX();x<img.getWidth();x++){
    498             for(int y=img.getMinY();y<img.getHeight();y++){
    499                      //获取点位的RGB值进行比较重新设定
    500                 rgb = img.getRGB(x, y); 
    501                 int R =(rgb & 0xff0000 ) >> 16 ; 
    502                 int G= (rgb & 0xff00 ) >> 8 ; 
    503                 int B= (rgb & 0xff ); 
    504                 if(((255-R)<30) && ((255-G)<30) && ((255-B)<30)){ 
    505                     rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff); 
    506                     img.setRGB(x, y, rgb);
    507                 }
    508             }
    509         }
    510     }
    511     
    512     
    513     /**
    514      * 图片格式转化操作(文件物理存盘)
    515      * 
    516      * @param imgPath    
    517      *                     原始图片存放地址
    518      * @param format
    519      *                     待转换的格式 jpeg,gif,png,bmp等
    520      * @param destPath
    521      *                     目标文件地址
    522      * @throws Exception
    523      */
    524     public static void formatConvert(String imgPath, String format, String destPath)throws Exception{
    525         try {
    526             BufferedImage bufferedImage = ImageIO.read(new File(imgPath));
    527             ImageIO.write(bufferedImage, format, new File(destPath));
    528         } catch (IOException e) {
    529             throw new RuntimeException("文件格式转换出错");
    530         }
    531     }
    532     
    533     
    534     
    535     /**
    536      * 图片格式转化操作返回BufferedImage对象
    537      * 
    538      * @param bufferedImage    
    539      *                     BufferedImage图片转换对象
    540      * @param format
    541      *                     待转换的格式 jpeg,gif,png,bmp等
    542      * @param destPath
    543      *                     目标文件地址
    544      * @throws Exception
    545      */
    546     public static void formatConvert(BufferedImage bufferedImag, String format, String destPath)throws Exception{
    547         try {
    548             ImageIO.write(bufferedImag, format, new File(destPath));
    549         } catch (IOException e) {
    550             throw new RuntimeException("文件格式转换出错");
    551         }
    552     }
    553     
    554     
    555     /**
    556      * 获取图片文件的真实格式信息
    557      * 
    558      * @param imgPath
    559      *                     图片原文件存放地址
    560      * @return
    561      *                     图片格式
    562      * @throws Exception
    563      */
    564     public static String imageFormat(String imgPath)throws Exception{
    565         File file = new File(imgPath);
    566         String format = "";    //图片格式
    567         byte[] bt=new byte[(int) file.length()];
    568         MemoryCacheImageInputStream mcis = new MemoryCacheImageInputStream(new ByteArrayInputStream(bt));
    569         Iterator<ImageReader> it = ImageIO.getImageReaders(mcis);
    570         while(it.hasNext()){
    571             ImageReader imgReader = (ImageReader)it.next();
    572             if(imgReader instanceof GIFImageReader){
    573                 format="gif";
    574             }else if(imgReader instanceof JPEGImageReader){
    575                 format="jpeg";
    576             }else if(imgReader instanceof PNGImageReader){
    577                 format="png";
    578             }else if(imgReader instanceof BMPImageReader){
    579                 format="bmp";
    580             }
    581         }
    582         return format;
    583     }
    584 
    585 }

     转载请注明出处[http://www.cnblogs.com/dennisit/archive/2012/12/28/2837452.html]

      在线交谈

  • 相关阅读:
    asp.net后台获取html控件的值
    asp.net自定义错误页面
    关于asp.net网站中web.config的配置
    在asp.net中如何使用Session
    Ubuntu 14.10 进入单用户模式
    原码,反码和补码
    利用位运算进行权限管理
    php redis扩展安装
    不同浏览器Cookie大小
    include和require的区别
  • 原文地址:https://www.cnblogs.com/dennisit/p/2837452.html
Copyright © 2020-2023  润新知