java圖片添加水印和壓縮

vqfq6057 8年前發布 | 5K 次閱讀 Java

圖片添加水印和壓縮
</div>

 

[Java]代碼    

package net.leebao.core.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

/**
 * 圖片水印
 */
public class ImageUtil {
    /**
     * @param args
     */
    public static void main(String[] args) {
        String srcImgPath = "E:/zhzq/1.png";
        String iconPath = "E:/zhzq/2.jpg";
        String targerPath = "E:/zhzq/4.png";
        // 給圖片添加水印
//      ImageUtil.waterMarkImageByIcon("java水印圖片", iconPath, srcImgPath, targerPath, 0, 0, 0, 0.5f);
        ImageUtil.waterMarkByText("java水印圖片", srcImgPath, targerPath, 0, 0, 0, 0.5f);
        // 給圖片添加水印,水印旋轉-45
        //       
    }

    /**
     * 給圖片添加水印、可設置水印圖片旋轉角度
     * 
     * @param iconPath
     *            水印圖片路徑
     * @param srcImgPath
     *            源圖片路徑
     * @param targerPath
     *            目標圖片路徑
     * @param degree
     *            水印圖片旋轉角度
     * @param width
     *            寬度(與左相比)
     * @param height
     *            高度(與頂相比)
     * @param clarity
     *            透明度(小于1的數)越接近0越透明
     */
    public static void waterMarkImageByIcon(String logoText, String iconPath, String srcImgPath, String targerPath,
            Integer degree, Integer width, Integer height, float clarity) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(new File(srcImgPath));
            System.out.println("width:" + srcImg.getWidth(null));
            System.out.println("height:" + srcImg.getHeight(null));
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            // 得到畫筆對象
            Graphics2D g = buffImg.createGraphics();
            // 設置對線段的鋸齒狀邊緣處理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            if (null != degree) {
                // 設置水印旋轉
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 水印圖象的路徑 水印一般為gif或者png的,這樣可設置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            // 得到Image對象。
            Image img = imgIcon.getImage();
            float alpha = clarity; // 透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 表示水印圖片的位置
            //          g.drawImage(img, width, height, null);
            g.drawImage(img, srcImg.getWidth(null) - img.getWidth(null), srcImg.getHeight(null) - img.getHeight(null), null);

            //          g.drawString(logoText, srcImg.getWidth(null) - img.getWidth(null), srcImg.getHeight(null) - img.getHeight(null));

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            g.dispose();
            os = new FileOutputStream(targerPath);
            // 生成圖片
            ImageIO.write(buffImg, "JPG", os);
            System.out.println("添加水印圖片完成!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 給圖片添加水印、可設置水印圖片旋轉角度
     * 
     * @param logoText
     *            水印文字
     * @param srcImgPath
     *            源圖片路徑
     * @param targerPath
     *            目標圖片路徑
     * @param degree
     *            水印圖片旋轉角度
     * @param width
     *            寬度(與左相比)
     * @param height
     *            高度(與頂相比)
     * @param clarity
     *            透明度(小于1的數)越接近0越透明
     */
    public static void waterMarkByText(String logoText, String srcImgPath, String targerPath, Integer degree, Integer width,
            Integer height, Float clarity) {
        // 主圖片的路徑
        InputStream is = null;
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            // 得到畫筆對象
            // Graphics g= buffImg.getGraphics();
            Graphics2D g = buffImg.createGraphics();
            // 設置對線段的鋸齒狀邊緣處理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            if (null != degree) {
                // 設置水印旋轉
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 設置顏色
            g.setColor(Color.red);
            // 設置 Font
            g.setFont(new Font("宋體", Font.BOLD, 30));
            float alpha = clarity;
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 第一參數->設置的內容,后面兩個參數->文字在圖片上的坐標位置(x,y) .
            g.drawString(logoText, width, height);
            g.dispose();
            os = new FileOutputStream(targerPath);
            // 生成圖片
            ImageIO.write(buffImg, "JPG", os);
            System.out.println("添加水印文字完成!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != is)
                    is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 圖片縮放(圖片等比例縮放為指定大小,空白部分以白色填充)
     * 
     * @param srcPath
     *            源圖片路徑
     * @param destPath
     *            縮放后圖片路徑
     */
    public static void zoomImage(String srcPath, String destPath, int destHeight, int destWidth) {
        try {
            BufferedImage srcBufferedImage = ImageIO.read(new File(srcPath));
            int imgWidth = destWidth;
            int imgHeight = destHeight;
            int srcWidth = srcBufferedImage.getWidth();
            int srcHeight = srcBufferedImage.getHeight();
            if (srcHeight >= srcWidth) {
                imgWidth = (int) Math.round(((destHeight * 1.0 / srcHeight) * srcWidth));
            } else {
                imgHeight = (int) Math.round(((destWidth * 1.0 / srcWidth) * srcHeight));
            }
            BufferedImage destBufferedImage = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = destBufferedImage.createGraphics();
            graphics2D.setBackground(Color.WHITE);
            graphics2D.clearRect(0, 0, destWidth, destHeight);
            graphics2D.drawImage(srcBufferedImage.getScaledInstance(imgWidth, imgHeight, Image.SCALE_SMOOTH), (destWidth / 2)
                    - (imgWidth / 2), (destHeight / 2) - (imgHeight / 2), null);
            graphics2D.dispose();
            ImageIO.write(destBufferedImage, "JPEG", new File(destPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 本文由用戶 vqfq6057 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!