您的位置:首页 > 编程语言 > Java开发

JAVA实现图片加水印及Base64图片字符串加水印

2017-11-24 13:19 246 查看



JAVA实现图片加水印及Base64图片字符串加水印

可将根据不同需求选择场景一,场景二来实现家水印操作,个人感觉比我上一遍文章<base64字符串加水印 >实在

场景一:

涉及上送过来的不直接是图片,而是Base64字符串,则先需转换读取,然后再打上水印,最后再合成一张返回Base64

package transtion;

 

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.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

 

/*******************************************************************************

 * Description: 图片水印工具类 

 * Copyright: Copyright (c) 2011 

 * Company: Founder 

 * Project: CMS

 * 

 * @Author taoxg

 * @version 1.0

 * @See 

 * HISTORY 2011-9-27 taoxg create

 ******************************************************************************/

public class waterBase64 {

     

    // 水印透明度 

    private static float alpha = 0.9f;

    // 水印横向位置

    private static int positionWidth = 150;

    // 水印纵向位置

    private static int positionHeight = 100;

    // 水印文字字体

    private static Font font = new Font("宋体", Font.BOLD, 30);

    // 水印文字颜色

    private static Color color = Color.red;

    /**

     * 

     * @param alpha 

     *          水印透明度

     * @param positionWidth 

     *          水印横向位置

     * @param positionHeight 

     *          水印纵向位置

     * @param font 

     *          水印文字字体

     * @param color 

     *          水印文字颜色

     */

    public static void setImageMarkOptions(float alpha , int positionWidth , int positionHeight ,Font font,Color color){

        if(alpha!=0.0f)waterBase64.alpha = alpha;

        if(positionWidth!=0)waterBase64.positionWidth = positionWidth;

        if(positionHeight!=0)waterBase64.positionHeight = positionHeight;

        if(font!=null)waterBase64.font = font;

        if(color!=null)waterBase64.color = color;

    }

     

    public static void main(String [] args){

    String srcImgPath = "666.png";  

    String iconPath = "water_logo.png";  

    String targerIconPath2 = "hecheng.jpg";

    String logoText = "我爱北京天安门"; 

    

    //可通过此方法调试间距,颜色.不适用则默认初始化数据

    setImageMarkOptions(0.9f,250,100,null,null);

        

        /**给图片添加水印图片,水印图片旋转-45*/

        markImageByIcon(iconPath, srcImgPath, targerIconPath2, 0); 

 

    }

 

    //读取图片转为Base64字符串

    public static String TuImage(String args) {  

        

        String imgFile = args;//待处理的图片     

        InputStream in = null;     

        byte[] data = null;     

        //读取图片字节数组     

        try{     

            in = new FileInputStream(imgFile);             

            data = new byte[in.available()];     

            in.read(data);     

            in.close();     

        }catch (IOException e){     

            e.printStackTrace();     

        }     

        //对字节数组Base64编码     

        BASE64Encoder encoder = new BASE64Encoder();     

        return encoder.encode(data);

    }

    

    /**

     * 给图片添加水印图片、可设置水印图片旋转角度

     * 

     * @param iconPath

     *            水印图片路径

     * @param srcImgPath

     *            源图片路径

     * @param targerPath

     *            目标图片路径

     * @param degree

     *            水印图片旋转角度

     */

    public static String markImageByIcon(String iconPath, String srcImgPath,String targerPath, Integer degree) {

       

    BASE64Encoder base64en = new BASE64Encoder();

    BASE64Decoder base64de = new BASE64Decoder();

    InputStream is = null;

    OutputStream os = null;

    byte [] b;

        try {

        //针对上送的图片是Base64场景

            b= base64de.decodeBuffer(TuImage(srcImgPath));

            is=new java .io.ByteArrayInputStream(b);

            BufferedImage srcImg = ImageIO.read(is);

            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

 

            // 1、得到画笔对象

            Graphics2D g = buffImg.createGraphics();

 

            // 2、设置对线段的锯齿状边缘处理

            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);

            // 3、设置水印旋转

            if (null != degree) {

                g.rotate(Math.toRadians(degree),(double) buffImg.get
4000
Width() / 2, (double) buffImg.getHeight() / 2);

            }

 

            // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度(本地地址可直接填写,服务器地址ImageIcon导包位置一定要正确)

            ImageIcon imgIcon = new ImageIcon(iconPath);

 

            // 5、得到Image对象。

            Image img = imgIcon.getImage();

             

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));

 

            // 6、水印图片的位置

            g.drawImage(img, positionWidth, positionHeight, null);

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

            // 7、释放资源

            g.dispose();

             

            // 8、生成图片

//            os = new FileOutputStream(targerPath);

//            ImageIO.write(buffImg, "JPG", os);

            

            //把图片转换为字节

            ByteArrayOutputStream bot = new ByteArrayOutputStream();

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bot);

            encoder.encode(buffImg);

            byte [] rstByte = bot.toByteArray();

            srcImgPath = base64en.encode(rstByte);           

            System.out.println("图片完成添加水印图片");

            return srcImgPath;

            

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                if (null != os)

                    os.close();

                if(null != is)

                is.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

return targerPath;

    }

}

场景二:

直接将图片加水印图片,加水印文字

package transtion;

 

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.InputStream;

import java.io.OutputStream;

 

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

 

/*******************************************************************************

 * Description: 图片水印工具类 

 * Copyright: Copyright (c) 2011 

 * Company: Founder 

 * Project: CMS

 * 

 * @Author taoxg

 * @version 1.0

 * @See 

 * HISTORY 2011-9-27 taoxg create

 ******************************************************************************/

public class ImageMarkLogoUtil {

     

    // 水印透明度 

    private static float alpha = 0.9f;

    // 水印横向位置

    private static int positionWidth = 150;

    // 水印纵向位置

    private static int positionHeight = 100;

    // 水印文字字体

    private static Font font = new Font("宋体", Font.BOLD, 30);

    // 水印文字颜色

    private static Color color = Color.red;

    /**

     * 

     * @param alpha 

     *          水印透明度

     * @param positionWidth 

     *          水印横向位置

     * @param positionHeight 

     *          水印纵向位置

     * @param font 

     *          水印文字字体

     * @param color 

     *          水印文字颜色

     */

    public static void setImageMarkOptions(float alpha , int positionWidth , int positionHeight ,Font font,Color color){

        if(alpha!=0.0f)ImageMarkLogoUtil.alpha = alpha;

        if(positionWidth!=0)ImageMarkLogoUtil.positionWidth = positionWidth;

        if(positionHeight!=0)ImageMarkLogoUtil.positionHeight = positionHeight;

        if(font!=null)ImageMarkLogoUtil.font = font;

        if(color!=null)ImageMarkLogoUtil.color = color;

    }

     

    /**

     * 给图片添加水印图片

     * 

     * @param iconPath

     *            水印图片路径

     * @param srcImgPath

     *            源图片路径

     * @param targerPath

     *            目标图片路径

     */

    public static void markImageByIcon(String iconPath, String srcImgPath,

            String targerPath) {

        markImageByIcon(iconPath, srcImgPath, targerPath, null);

    }

 

    /**

     * 给图片添加水印图片、可设置水印图片旋转角度

     * 

     * @param iconPath

     *            水印图片路径

     * @param srcImgPath

     *            源图片路径

     * @param targerPath

     *            目标图片路径

     * @param degree

     *            水印图片旋转角度

     */

    public static void markImageByIcon(String iconPath, String srcImgPath,

            String targerPath, Integer degree) {

        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);

 

            // 1、得到画笔对象

            Graphics2D g = buffImg.createGraphics();

 

            // 2、设置对线段的锯齿状边缘处理

            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);

            // 3、设置水印旋转

            if (null != degree) {

                g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);

            }

 

            // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度(本地地址可直接填写,服务器地址ImageIcon导包位置一定要正确)

            ImageIcon imgIcon = new ImageIcon(iconPath);

 

            // 5、得到Image对象。

            Image img = imgIcon.getImage();

             

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));

 

            // 6、水印图片的位置

            g.drawImage(img, positionWidth, positionHeight, null);

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

            // 7、释放资源

            g.dispose();

             

            // 8、生成图片

            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

     *          目标图片路径

     */

    public static void markImageByText(String logoText, String srcImgPath,

            String targerPath) {

        markImageByText(logoText, srcImgPath, targerPath, null);

    }

 

    /**

     * 给图片添加水印文字、可设置水印文字的旋转角度

     * 

     * @param logoText

     * @param srcImgPath

     * @param targerPath

     * @param degree

     */

    public static void markImageByText(String logoText, String srcImgPath,

            String targerPath, Integer degree) {

         

        InputStream is = null;

        OutputStream os = null;

        try {

            // 1、源图片

            Image srcImg = ImageIO.read(new File(srcImgPath));

            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

 

            // 2、得到画笔对象

            Graphics2D g = buffImg.createGraphics();

            // 3、设置对线段的锯齿状边缘处理

            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);

            // 4、设置水印旋转

            if (null != degree) {

                g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);

            }

            // 5、设置水印文字颜色

            g.setColor(color);

            // 6、设置水印文字Font

            g.setFont(font);

            // 7、设置水印文字透明度

            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));

            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)

            g.drawString(logoText, positionWidth, positionHeight);

            // 9、释放资源

            g.dispose();

            // 10、生成图片

            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();

            }

        }

    }

     

    public static void main(String [] args){

    String srcImgPath = "666.png";  

    String iconPath = "water_logo.png";  

    String targerIconPath2 = "hecheng.jpg";

    String logoText = "我爱北京天安门"; 

   

    //可通过此方法调试间距,颜色.不适用则默认初始化数据

    setImageMarkOptions(0.9f,250,100,null,null);

        

        /**给图片添加水印图片,水印图片旋转-45*/

//        markImageByIcon(iconPath, srcImgPath, targerIconPath2, 0); 

        /**给图片添加水印图片,水印图片旋转-45  平行*/ 

//        markImageByIcon(iconPath, srcImgPath, targerIconPath2,45);  

        /**给图片添加水印文字,水印图片旋转  平行*/ 

//        markImageByText(logoText, srcImgPath, targerIconPath2);  

        /**给图片添加水印文字,水印图片旋转-45*/ 

        markImageByText(logoText, srcImgPath, targerIconPath2, -45);  

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息