熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

java圖片處理類(圖片水印,圖片縮放)

2013-11-15 11:56:57  來源: JSP教程 

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

  代碼如下 復制代碼
import javaawtAlphaComposite;
import javaawtColor;
import javaawtFont;
import javaawtGraphics;
import javaawtGraphicsD;
import javaawtImage;
import javaawtToolkit;
import javaawtcolorColorSpace;
import javaawtgeomAffineTransform;
import javaawtimageAffineTransformOp;
import javaawtimageBufferedImage;
import javaawtimageColorConvertOp;
import javaawtimageCropImageFilter;
import javaawtimageFilteredImageSource;
import javaawtimageImageFilter;
import javaioFile;
import javaioIOException;

  import javaximageioImageIO;

  /**
 * 圖片處理工具類<br>
 * 功能縮放圖像切割圖像圖像類型轉換彩色轉黑白文字水印圖片水印等
 * @author Administrator
 */
public class ImageUtils {

  /**
     * 幾種常見的圖片格式
     */
    public static String IMAGE_TYPE_GIF = "gif";// 圖形交換格式
    public static String IMAGE_TYPE_JPG = "jpg";// 聯合照片專家組
    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

  /**
     * 程序入口用於測試
     * @param args
     */
    public static void main(String[] args) {
        // 縮放圖像
        // 方法一按比例縮放
        ImageUtilsscale("e:/abcjpg" "e:/abc_scalejpg" true);//測試OK
        // 方法二按高度和寬度縮放
        ImageUtilsscale("e:/abcjpg" "e:/abc_scalejpg" true);//測試OK

  // 切割圖像
        // 方法一按指定起點坐標和寬高切割
        ImageUtilscut("e:/abcjpg" "e:/abc_cutjpg" );//測試OK
        // 方法二指定切片的行數和列數
        ImageUtilscut("e:/abcjpg" "e:/" );//測試OK
        // 方法三指定切片的寬度和高度
        ImageUtilscut("e:/abcjpg" "e:/" );//測試OK

  // 圖像類型轉換
        ImageUtilsconvert("e:/abcjpg" "GIF" "e:/abc_convertgif");//測試OK

  // 彩色轉黑白
        ImageUtilsgray("e:/abcjpg" "e:/abc_grayjpg");//測試OK

  // 給圖片添加文字水印
        // 方法一
        ImageUtilspressText("我是水印文字""e:/abcjpg""e:/abc_pressTextjpg""宋體"FontBOLDColorwhite f);//測試OK
        // 方法二
        ImageUtilspressText("我也是水印文字" "e:/abcjpg""e:/abc_pressTextjpg" "黑體" Colorwhite f);//測試OK
       
        // 給圖片添加圖片水印
        ImageUtilspressImage("e:/abcjpg" "e:/abcjpg""e:/abc_pressImagejpg" f);//測試OK
    }

  /**
     * 縮放圖像(按比例縮放)
     * @param srcImageFile 源圖像文件地址
     * @param result 縮放後的圖像地址
     * @param scale 縮放比例
     * @param flag 縮放選擇:true 放大; false 縮小;
     */
    public final static void scale(String srcImageFile String result
            int scale boolean flag) {
        try {
            BufferedImage src = ImageIOread(new File(srcImageFile)); // 讀入文件
            int width = srcgetWidth(); // 得到源圖寬
            int height = srcgetHeight(); // 得到源圖長
            if (flag) {// 放大
                width = width * scale;
                height = height * scale;
            } else {// 縮小
                width = width / scale;
                height = height / scale;
            }
            Image image = srcgetScaledInstance(width height
                    ImageSCALE_DEFAULT);
            BufferedImage tag = new BufferedImage(width height
                    BufferedImageTYPE_INT_RGB);
            Graphics g = taggetGraphics();
            gdrawImage(image null); // 繪制縮小後的圖
            gdispose();
            ImageIOwrite(tag "JPEG" new File(result));// 輸出到文件流
        } catch (IOException e) {
            eprintStackTrace();
        }
    }

  /**
     * 縮放圖像(按高度和寬度縮放)
     * @param srcImageFile 源圖像文件地址
     * @param result 縮放後的圖像地址
     * @param height 縮放後的高度
     * @param width 縮放後的寬度
     * @param bb 比例不對時是否需要補白true為補白; false為不補白;
     */
    public final static void scale(String srcImageFile String result int height int width boolean bb) {
        try {
            double ratio = ; // 縮放比例
            File f = new File(srcImageFile);
            BufferedImage bi = ImageIOread(f);
            Image itemp = bigetScaledInstance(width height biSCALE_SMOOTH);
            // 計算比例
            if ((bigetHeight() > height) || (bigetWidth() > width)) {
                if (bigetHeight() > bigetWidth()) {
                    ratio = (new Integer(height))doubleValue()
                            / bigetHeight();
                } else {
                    ratio = (new Integer(width))doubleValue() / bigetWidth();
                }
                AffineTransformOp op = new AffineTransformOp(AffineTransform
                        getScaleInstance(ratio ratio) null);
                itemp = opfilter(bi null);
            }
            if (bb) {//補白
                BufferedImage image = new BufferedImage(width height
                        BufferedImageTYPE_INT_RGB);
                GraphicsD g = imagecreateGraphics();
                gsetColor(Colorwhite);
                gfillRect( width height);
                if (width == itempgetWidth(null))
                    gdrawImage(itemp (height itempgetHeight(null)) /
                            itempgetWidth(null) itempgetHeight(null)
                            Colorwhite null);
                else
                    gdrawImage(itemp (width itempgetWidth(null)) /
                            itempgetWidth(null) itempgetHeight(null)
                            Colorwhite null);
                gdispose();
                itemp = image;
            }
            ImageIOwrite((BufferedImage) itemp "JPEG" new File(result));
        } catch (IOException e) {
            eprintStackTrace();
        }
    }
   
    /**
     * 圖像切割(按指定起點坐標和寬高切割)
     * @param srcImageFile 源圖像地址
     * @param result 切片後的圖像地址
     * @param x 目標切片起點坐標X
     * @param y 目標切片起點坐標Y
     * @param width 目標切片寬度
     * @param height 目標切片高度
     */
    public final static void cut(String srcImageFile String result
            int x int y int width int height) {
        try {
            // 讀取源圖像
            BufferedImage bi = ImageIOread(new File(srcImageFile));
            int srcWidth = bigetHeight(); // 源圖寬度
            int srcHeight = bigetWidth(); // 源圖高度
            if (srcWidth > && srcHeight > ) {
                Image image = bigetScaledInstance(srcWidth srcHeight
                        ImageSCALE_DEFAULT);
                // 四個參數分別為圖像起點坐標和寬高
                // 即: CropImageFilter(int xint yint widthint height)
                ImageFilter cropFilter = new CropImageFilter(x y width height);
                Image img = ToolkitgetDefaultToolkit()createImage(
                        new FilteredImageSource(imagegetSource()
                                cropFilter));
                BufferedImage tag = new BufferedImage(width height BufferedImageTYPE_INT_RGB);
                Graphics g = taggetGraphics();
                gdrawImage(img width height null); // 繪制切割後的圖
                gdispose();
                // 輸出為文件
                ImageIOwrite(tag "JPEG" new File(result));
            }
        } catch (Exception e) {
            eprintStackTrace();
        }
    }
   
    /**
     * 圖像切割(指定切片的行數和列數)
     * @param srcImageFile 源圖像地址
     * @param descDir 切片目標文件夾
     * @param rows 目標切片行數默認必須是范圍 [ ] 之內
     * @param cols 目標切片列數默認必須是范圍 [ ] 之內
     */
    public final static void cut(String srcImageFile String descDir
            int rows int cols) {
        try {
            if(rows<=||rows>) rows = ; // 切片行數
            if(cols<=||cols>) cols = ; // 切片列數
            // 讀取源圖像
            BufferedImage bi = ImageIOread(new File(srcImageFile));
            int srcWidth = bigetHeight(); // 源圖寬度
            int srcHeight = bigetWidth(); // 源圖高度
            if (srcWidth > && srcHeight > ) {
                Image img;
                ImageFilter cropFilter;
                Image image = bigetScaledInstance(srcWidth srcHeight ImageSCALE_DEFAULT);
                int destWidth = srcWidth; // 每張切片的寬度
                int destHeight = srcHeight; // 每張切片的高度
                // 計算切片的寬度和高度
                if (srcWidth % cols == ) {
                    destWidth = srcWidth / cols;
                } else {
                    destWidth = (int) Mathfloor(srcWidth / cols) + ;
                }
                if (srcHeight % rows == ) {
                    destHeight = srcHeight / rows;
                } else {
                    destHeight = (int) Mathfloor(srcWidth / rows) + ;
                }
                // 循環建立切片
                // 改進的想法:是否可用多線程加快切割速度
                for (int i = ; i < rows; i++) {
                    for (int j = ; j < cols; j++) {
                        // 四個參數分別為圖像起點坐標和寬高
                        // 即: CropImageFilter(int xint yint widthint height)
                        cropFilter = new CropImageFilter(j * destWidth i * destHeight
                                destWidth destHeight);
                        img = ToolkitgetDefaultToolkit()createImage(
                                new FilteredImageSource(imagegetSource()
                                        cropFilter));
                        BufferedImage tag = new BufferedImage(destWidth
                                destHeight BufferedImageTYPE_INT_RGB);
                        Graphics g = taggetGraphics();
                        gdrawImage(img null); // 繪制縮小後的圖
                        gdispose();
                        // 輸出為文件
                        ImageIOwrite(tag "JPEG" new File(descDir
                                + "_r" + i + "_c" + j + "jpg"));
                    }
                }
            }
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 圖像切割(指定切片的寬度和高度)
     * @param srcImageFile 源圖像地址
     * @param descDir 切片目標文件夾
     * @param destWidth 目標切片寬度默認
     * @param destHeight 目標切片高度默認
     */
    public final static void cut(String srcImageFile String descDir
            int destWidth int destHeight) {
        try {
            if(destWidth<=) destWidth = ; // 切片寬度
            if(destHeight<=) destHeight = ; // 切片高度
            // 讀取源圖像
            BufferedImage bi = ImageIOread(new File(srcImageFile));
            int srcWidth = bigetHeight(); // 源圖寬度
            int srcHeight = bigetWidth(); // 源圖高度
            if (srcWidth > destWidth && srcHeight > destHeight) {
                Image img;
                ImageFilter cropFilter;
                Image image = bigetScaledInstance(srcWidth srcHeight ImageSCALE_DEFAULT);
                int cols = ; // 切片橫向數量
                int rows = ; // 切片縱向數量
                // 計算切片的橫向和縱向數量
                if (srcWidth % destWidth == ) {
                    cols = srcWidth / destWidth;
                } else {
                    cols = (int) Mathfloor(srcWidth / destWidth) + ;
                }
                if (srcHeight % destHeight == ) {
                    rows = srcHeight / destHeight;
                } else {
                    rows = (int) Mathfloor(srcHeight / destHeight) + ;
                }
                // 循環建立切片
                // 改進的想法:是否可用多線程加快切割速度
                for (int i = ; i < rows; i++) {
                    for (int j = ; j < cols; j++) {
                        // 四個參數分別為圖像起點坐標和寬高
                        // 即: CropImageFilter(int xint yint widthint height)
                        cropFilter = new CropImageFilter(j * destWidth i * destHeight
                                destWidth destHeight);
                        img = ToolkitgetDefaultToolkit()createImage(
                                new FilteredImageSource(imagegetSource()
                                        cropFilter));
                        BufferedImage tag = new BufferedImage(destWidth
                                destHeight BufferedImageTYPE_INT_RGB);
                        Graphics g = taggetGraphics();
                        gdrawImage(img null); // 繪制縮小後的圖
                        gdispose();
                        // 輸出為文件
                        ImageIOwrite(tag "JPEG" new File(descDir
                                + "_r" + i + "_c" + j + "jpg"));
                    }
                }
            }
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 圖像類型轉換GIF>JPGGIF>PNGPNG>JPGPNG>GIF(X)BMP>PNG
     * @param srcImageFile 源圖像地址
     * @param formatName 包含格式非正式名稱的 String如JPGJPEGGIF等
     * @param destImageFile 目標圖像地址
     */
    public final static void convert(String srcImageFile String formatName String destImageFile) {
        try {
            File f = new File(srcImageFile);
            fcanRead();
            fcanWrite();
            BufferedImage src = ImageIOread(f);
            ImageIOwrite(src formatName new File(destImageFile));
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 彩色轉為黑白
     * @param srcImageFile 源圖像地址
     * @param destImageFile 目標圖像地址
     */
    public final static void gray(String srcImageFile String destImageFile) {
        try {
            BufferedImage src = ImageIOread(new File(srcImageFile));
            ColorSpace cs = ColorSpacegetInstance(ColorSpaceCS_GRAY);
            ColorConvertOp op = new ColorConvertOp(cs null);
            src = opfilter(src null);
            ImageIOwrite(src "JPEG" new File(destImageFile));
        } catch (IOException e) {
            eprintStackTrace();
        }
    }

  /**
     * 給圖片添加文字水印
     * @param pressText 水印文字
     * @param srcImageFile 源圖像地址
     * @param destImageFile 目標圖像地址
     * @param fontName 水印的字體名稱
     * @param fontStyle 水印的字體樣式
     * @param color 水印的字體顏色
     * @param fontSize 水印的字體大小
     * @param x 修正值
     * @param y 修正值
     * @param alpha 透明度alpha 必須是范圍 [ ] 之內(包含邊界值)的一個浮點數字
     */
    public final static void pressText(String pressText
            String srcImageFile String destImageFile String fontName
            int fontStyle Color color int fontSizeint x
            int y float alpha) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIOread(img);
            int width = srcgetWidth(null);
            int height = srcgetHeight(null);
            BufferedImage image = new BufferedImage(width height
                    BufferedImageTYPE_INT_RGB);
            GraphicsD g = imagecreateGraphics();
            gdrawImage(src width height null);
            gsetColor(color);
            gsetFont(new Font(fontName fontStyle fontSize));
            gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
                    alpha));
            // 在指定坐標繪制水印文字
            gdrawString(pressText (width (getLength(pressText) * fontSize))
                    / + x (height fontSize) / + y);
            gdispose();
            ImageIOwrite((BufferedImage) image "JPEG" new File(destImageFile));// 輸出到文件流
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 給圖片添加文字水印
     * @param pressText 水印文字
     * @param srcImageFile 源圖像地址
     * @param destImageFile 目標圖像地址
     * @param fontName 字體名稱
     * @param fontStyle 字體樣式
     * @param color 字體顏色
     * @param fontSize 字體大小
     * @param x 修正值
     * @param y 修正值
     * @param alpha 透明度alpha 必須是范圍 [ ] 之內(包含邊界值)的一個浮點數字
     */
    public final static void pressText(String pressText String srcImageFileString destImageFile
            String fontName int fontStyle Color color int fontSize int x
            int y float alpha) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIOread(img);
            int width = srcgetWidth(null);
            int height = srcgetHeight(null);
            BufferedImage image = new BufferedImage(width height
                    BufferedImageTYPE_INT_RGB);
            GraphicsD g = imagecreateGraphics();
            gdrawImage(src width height null);
            gsetColor(color);
            gsetFont(new Font(fontName fontStyle fontSize));
            gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
                    alpha));
            // 在指定坐標繪制水印文字
            gdrawString(pressText (width (getLength(pressText) * fontSize))
                    / + x (height fontSize) / + y);
            gdispose();
            ImageIOwrite((BufferedImage) image "JPEG" new File(destImageFile));
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 給圖片添加圖片水印
     * @param pressImg 水印圖片
     * @param srcImageFile 源圖像地址
     * @param destImageFile 目標圖像地址
     * @param x 修正值 默認在中間
     * @param y 修正值 默認在中間
     * @param alpha 透明度alpha 必須是范圍 [ ] 之內(包含邊界值)的一個浮點數字
     */
    public final static void pressImage(String pressImg String srcImageFileString destImageFile
            int x int y float alpha) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIOread(img);
            int wideth = srcgetWidth(null);
            int height = srcgetHeight(null);
            BufferedImage image = new BufferedImage(wideth height
                    BufferedImageTYPE_INT_RGB);
            GraphicsD g = imagecreateGraphics();
            gdrawImage(src wideth height null);
            // 水印文件
            Image src_biao = ImageIOread(new File(pressImg));
            int wideth_biao = src_biaogetWidth(null);
            int height_biao = src_biaogetHeight(null);
            gsetComposite(AlphaCompositegetInstance(AlphaCompositeSRC_ATOP
                    alpha));
            gdrawImage(src_biao (wideth wideth_biao) /
                    (height height_biao) / wideth_biao height_biao null);
            // 水印文件結束
            gdispose();
            ImageIOwrite((BufferedImage) image  "JPEG" new File(destImageFile));
        } catch (Exception e) {
            eprintStackTrace();
        }
    }

  /**
     * 計算text的長度(一個中文算兩個字符)
     * @param text
     * @return
     */
    public final static int getLength(String text) {
        int length = ;
        for (int i = ; i < textlength(); i++) {
            if (new String(textcharAt(i) + "")getBytes()length > ) {
                length += ;
            } else {
                length += ;
            }
        }
        return length / ;
    }
}
 


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19949.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.