首頁  >  文章  >  Java  >  詳解java實現影像的縮放,切割,類型轉換,水印等功能的實現

詳解java實現影像的縮放,切割,類型轉換,水印等功能的實現

巴扎黑
巴扎黑原創
2017-08-01 11:36:241679瀏覽

可實現以下常用功能:縮放影像、切割影像、影像類型轉換、彩色轉黑白、文字浮水印、圖片浮水印等

 程式碼如下複製程式碼
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java .awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java. .image.ImageFilter;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
 * 圖片處理工具類別:

 * 功能:縮放影像、切割影像、影像類型轉換、彩色轉黑白、文字浮水印、圖片浮水印等
 * @author Administrator
  */
public class ImageUtils {

    /**
     * 幾種常見的圖片格式
    */
    public static String IMAGE_TYPE_GIF = "gif";// 圖形交換格式
   public staticic ";// 組合照片專家小組
    public static String IMAGE_TYPE_JPEG = "jpeg";// 合照專家小組
    public static String IMAGE_TYPE_BMP = "bmp";// Bitmap(點圖)的簡寫,它是Windows作業系統中的標準圖片檔案格式
    public static String IMAGE_TYPE_PNG = "png";// 可移植網路圖形
    public static String IMAGE_TYPE_PSD = "psd";// Photoshop Photoshop的專用格式Photoshop

#    /**

     * 程序入口:用於測試
     * @param args
    */
    public static void main(String[] args) {
        // 1-縮放影像:##  .scale("e:/abc.jpg", "e:/abc_scale.jpg", 2, true);//測試OK
        // 方法二:依高度及寬度縮放-#   "e:/abc.jpg", "e:/abc_scale2.jpg", 500, 300, true);//測試OK

        // 2-切割影像:
  按指定起點座標和寬高切割
        ImageUtils.cut("e:/abc.jpg", "e:/abc_cut.jpg", 0, 0, 400, 400 );//測試OK# / 方法二:指定切片的行數和列數

        ImageUtils.cut2("e:/abc.jpg", "e:/", 2, 2 );//測試OK

   :指定切片的寬度與高度
        ImageUtils.cut3("e:/abc.jpg", "e:/", 300, 300 );//測試OK
##   轉換:
        ImageUtils.convert("e:/abc.jpg", "GIF", "e:/abc_convert.gif");//測試轉頁

    
        ImageUtils.gray("e:/abc.jpg", "e:/abc_gray.jpg");//測試OK

      / 方法一:
        ImageUtils.pressText("我是浮水印文字","e:/abc.jpg","e:/abc_pressText.jpg","宋體",Font.BOLD,Color.white,80, 0, 0, 0.5f);//測試OK

        // 方法二:

        ImageUtils.pressText2("我也是浮水印文字", "e:/abc.jpg","e:/abg_press ", "黑體", 36, Color.white, 80, 0, 0, 0.5f);//測試OK
       

       e:/abc2.jpg", "e:/abc.jpg","e:/abc_pressImage.jpg", 0, 0, 0.5f);//測試OK

#    }

    /**
     * 縮放圖像(按比例縮放)
      * 縮放影像(按比例縮放)
     * @param srcImageFile 來源影像檔案位址
     * @param result 縮放後的影像 縮放選擇:true 放大; false 縮小;
    */
    public final static void scale(String srcImageFile, String result,
                 BufferedImage src = ImageIO.read (新檔案(srcImageFile)); // 讀入檔案
            int width = src.getWidth(); // 取得來源圖寬
            int height = src.getHeight(); // 取得來源圖長
            if (flag) {// 放大
              height * scale;
            } else {// 縮小
                width = widthth = widthth / 比例;
                高度= 高度/ 比例;
           
                    Image.SCALE_DEFAULT);
          高度,
                    BufferedImage.TYPE_INT_RGB);
      g.drawImage(image, 0, 0, null); // 縮小後的圖片
            g.dispose();
             g.dispose();
             原始的{
            e.printStackTrace();
        }
    }
#

    /**
     * 縮放影像(以高度和寬度縮放)
     * @param srcImageFile 來源影像檔案位址
     * @param result 縮放後的影像位址##    . * @param width 縮放後的寬度
     * @param bb 比例不對時是否需要補白:true為補白; false為不補白;
    */
    public final static void scale2(String srcImageFile, String result, int height, int width, boolean  = 0.0; // 縮放比例
            File f = new File(srcImageFile);
           getScaledInstance(width, height, bi.SCALE_SMOOTH);
            // 計算比例
            if ((bi.getHeight() > height .getHeight() > bi.getWidth( )) {
                    比率= (new Integer(height)).doubleValue()
      ight();
               } else {
                getWidth();
                }
                           .getScaleInstance(比率與比率), null);
           
           if (bb) {//補白
               BufferedImage )          BufferedImage.TYPE_INT_RGB);
                (Color.white);
                g.fillRect(0, 0, 寬度, 高度);
                      g.drawImage(itemp, 0, (高度- itemp.getHeight(null)) / 2,
                           itemp.getWidth(null), itemp.getHeight(null),
                            Color.white, null);
                else
                    g .drawImage(itemp , (width - itemp.getWidth(null)) / 2, 0,
                                             Color.white, null);
                g.dispose();
                itemp = image;
           new File(結果));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    ## ,
            int x, int y, int width, int height) {
        try {
            // );
            int srcWidth = bi .getHeight(); // 源圖寬度
            int srcHeight = bi.getWidth(); // 源圖高度
            if (srcWidth > 0 && srcHeight > 0) {
                              Image.SCALE_DEFAULT);
                    為影像起點座標與寬高
                //即: CropImageFilter(int x,int y,int width,int height)## , y, width, height);
                Image img = Toolkit.getDefaultToolkit().createImage(
                      new Fil                 cropFilter));
                 BufferedImage 標記圖形g = tag.getGraphics();
                g.drawImage(img, 0, 0, 寬度, 高度, null); // 高精準度切割後的圖片
                               .write(tag, "JPEG", new File(result));
            }
        } catch (Exception e) {
            e.printStackTrace();
      指定切片的行數和列數)
     * @param srcImageFile 來源影像位址
     * @param descDir 切片目標資料夾
     * @param rows 目標切片行數。     * @param cols 目標切片列數。預設2,必須是範圍[1, 20] 之內
     */
    public final static void cut2(String srcImageFile, String descDir,
   try {
            if(rows<=0||rows>20) rows = 2; // 切片行數
                / / 讀取來源影像
            BufferedImage bi = ImageIO.read(new File(srcImageFile));
            int srcHeight = bi.getWidth() ; // 源圖高度
           if (srcWidth > 0 && srcHeight > 0) {
          ImageFilter cropFilter;
                Image image = bi.getScaledInstance(srcWidth, srcHeight, Image. SCALE_DEFAULT);
                int destWidth = srcWidth; // 每張切片的寬度
                 // 計算切片的寬度與高度
               if (srcWidth % cols == 0) {
                    destWidth = srcWidth / cols;#               destWidth = (int) Math.floor(srcWidth / cols) + 1;
       ( srcHeight % rows == 0) {
                    destHeight = srcHeight / rows;
                } else {
                    destHeight = (int) Math.floor(srcWidth / rows) + 1;
                }
                / / 循環建立切片
                // 改善的想法:是否可用多執行緒加速切割速度
                       for (int j = 0; j < ; cols; j++) {
                        // 四個參數分別為影像起點座標   CropImageFilter(int x,int y,int width,int height)
                        (j * destWidth, i * destHeight,
                                      img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
                                            BufferedImage tag = new BufferedImage(destWidth,
      stHeight, BufferedImage.TYPE_INT_RGB);
                        中 g = tag.getGraphics();
                        g.drawImage(img, 0, 0, null);  g.dispose();
                        // 輸出為檔案
   PEG ", new File(descDir
                              }          }
                }
         {
            e.printStackTrace();
        }
    }
#

    /**
     * 影像切割(指定切片的寬度和高度)
     * @param srcImageFile 來源影像位址
     * @param descDir 切片目標資料夾>預設200
     * @param destHeight 目標切片高度。預設150
    */
    public final static void cut3(String srcImageFile, String descDir,
                   if(destWidth<=0 ) destWidth = 200; // 切片寬度
            if(destHeight<=0) destHeight = 150; // #      BufferedImage bi = ImageIO.read(new File(srcImageFile ));
            int srcWidth = bi.getHeight(); // 來源圖寬度
           if (srcWidth > destWidth && srcHeight > destHeight) {
               為image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);
                int cols = 0; // 切片橫向數#; // 切片切片int rows = 0; // 切片縱向數量
                // 計算切片的橫向與縱向數量
                     cols = srcWidth / destWidth;
            
                           if (srcHeight % destHeight == 0) {
                  else {
                    rows = (int) Math.floor(srcHeight/ destHeight) +        // 循環建立切片
                // 改善的想法:是否可用多執行緒加快切割速度
                for (int i = 0; i < rows; i++) {
                               // 四個參數分別為影像起點座標及寬高
                        //即: CropImageFilter(int x,int y id   cropFilter = new CropImageFilter(j * destWidth, i * destHeight,
destWidth, destHeight);
img = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(image.getSource(),
                                            BufferedImage tag = new BufferedImage(destWidth,
      stHeight, BufferedImage.TYPE_INT_RGB);
                        中 g = tag.getGraphics();
                        g.drawImage(img, 0, 0, null);  g.dispose();
                        // 輸出為檔案
   PEG ", new File(descDir
                              }          }
                }
         {
            e.printStackTrace();
        }
    }
#

/**
* 图像类型转换:GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG
     * @param srcImageFile 源图像地址
     * @param formatName 包含格式非正式名称的 String:如JPG、JPEG、GIF等
     * @param destImageFile 目标图像地址
     */
    public final static void convert(String srcImageFile, String formatName, String destImageFile) {
        try {
            File f = new File(srcImageFile);
            f.canRead();
            f.canWrite();
            BufferedImage src = ImageIO.read(f);
            ImageIO.write(src, formatName, new File(destImageFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 彩色轉為黑白
     * @param srcImageFile 來源影像位址
     * @param destImageFile 目標影像位址
     * @param destImageFile 目標影像位址
   */
    public final static void grey(String srcImageFile, String destImageFile) {
       rcImageFile));
            ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
          op.filter(src, null);
            ImageIO.write(src , "JPEG", new File(destImageFile));
        } /**
     * 新增文字浮水印
     * @param pressText 水印文字
     * @param srcImageFile 來源影像位址
   ##     * @param fontStyle 浮水印的字型樣式

     * @param color 水印的字型顏色

     * @param fontSize 水印的字體大小
     * @param alpha 透明度:alpha 必須是範圍[0.0, 1.0] 之內(包含邊界值)的一個浮點數
    */
    public final static void pressText(String pressText,
            String srcImageFile, String destImage ,int x,
            int y, float alpha ) {
        嘗試{
            File img = new File(srcImageFile);
        int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(寬度, 高度,
                 Graphics2D g = image.createGraphics();
            g.drawImage(src, 0, 0, 寬度, 高度, null);
            g.setColor(color);
           g.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_ATOP,
                    alpha)));
       Text, (width - (getLength(pressText) * fontSize))
                    / 2 + x , (height - fontSize) / 2 + y);
            g.dispose();
            ImageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));// 輸出到文件流
        } catch (例外e) {
            e.printStackTrace();
        }##  

    /**
     * 新增文字浮水印
     * @param pressText 水印文字
     * @param srcImageFile 來源影像位址
   * @param fontStyle 字體樣式
     * @param color 字體顏色
     * @param fontSize 字體大小
     * @param x 修正值:alpha 必須是範圍[0.0, 1.0] 之內(包含邊界值)的一個浮點數字
    */
    public final static void pressText2(String pressText, String srcImageFile,String destImageFile,
     int y, float alpha) {
        嘗試{
            File img = new File(srcImage age);          int width = src.getWidth(null);
            int height = src.getHeight(null);
            Buffered       BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.create .drawImage(src, 0, 0, 寬度, 高度, null);
            g.setColor(color);
             g.setComposite (AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    ,    g.drawString(pressText, (width - (getLength(pressText) * fontSize)))
                   / 2 + x, (高- fontSize) / 2 + y);
    ageIO.write((BufferedImage) image, "JPEG", new File(destImageFile));
        } catch (例外 e) {
            e.printStackTrace();
        }##  

    /**
     * 新增圖片水印
     * @param pressImg 水印圖片
     * @param srcImageFile 來源影像位址
   預設在中間
     * @param y 修正值。 預設在中間
     * @param alpha 透明度:alpha 必須是範圍 [0.0, 1.0] 之內(包含邊界值)的浮點數
    */
    public final static void pressImage(String pressImg, String srcImageFile,String destImageFile,
    嘗試 {
文件img = new File(srcImageFile);
            影像src = ImageIO.read(img);
          int height = src.getHeight(null);## #bufferedimage image = new bufferedimage(wideth,height,
bufferedimage.type_int_rgb);
graphics2d g = image.creategraphics();
g.drawimage(src,0,0,0,0,0, 0,0,wideth,height,null,null),null,null) ;
            // 水印檔案
             int width_biao = src_biao. getWidth(null);
            int height_biao = src_biao.getHeight(null) ;
                      alpha));
            g.drawImage(src_biao, ( width - width_biao) / 2,
                   (高度- height_biao)/ 2 ,idth_biao, height_biao, null_biao)/ 2 , w #            g.dispose();
            ImageIO.write(( BufferedImage) image,  "JPEG", new File(destImageFile));
        } catch (異常e) {
        ##    /* *
     * 計算text的長度(一個中文算兩個字元)
     * @param text
     * @return
    */
    public final static int getLength(String text ) {
        int length = 0;
        for (int i = 0;我            if (new String(text.charAt(i) + "").getBytes().length > 1) {
        } else {
               長度+ = 1;

            }

#        }
       與長度/使用 2;#

以上是詳解java實現影像的縮放,切割,類型轉換,水印等功能的實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn