疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中如何画图片与水印,验证码


 

 
一、简单说明
在 web 应用中,有时为了防止别人盗用自己精心设计的图片,可以在显示图片时给图片添加水印图片或者自己的宣传文字,这样即使别人盗用图片,也相当于为原作者做了免费宣传。给图片添加水印或图片的原理是:根据图片的路径,将图片读取到内存中,然后给内存中的图片对象添加文字,或添加已经准备好的水印图片,水印图片或文字添加好后,输出为文件或输出到页面显示。
 
二、画图(输出图片)
注:发布运行默认是访问 index.jsp 页面,我们可以在地址后加上 servlet 处理类的路径进行访问,也可以在 index.jsp 页面这样做
 
<img alt="" src="servlet路径">
 
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
 
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;
 
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        doPost(request, response);
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //得到图片源
        ImageIcon img_main=new ImageIcon(super.getServletContext().getRealPath("/images/main.jpg"));
        //得到图片源
        ImageIcon img_logo=new ImageIcon(super.getServletContext().getRealPath("/images/logo.gif"));
        //制作画布
        BufferedImage buf=new BufferedImage(img_main.getIconWidth(), img_main.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR);
        //画笔
        Graphics g=buf.getGraphics();
        //画图
        g.drawImage(img_main.getImage(), 0, 0, null);
        g.drawImage(img_logo.getImage(), 10, 10, null);
        //设置画笔的颜色
        g.setColor(Color.BLACK);
        //设置画笔的格式
        g.setFont(new Font("宋体", Font.ITALIC, 18));
        //下面写字符串
        g.drawString("http://www.cqzuxia.com", 10, img_logo.getIconHeight()+25);
        //创建一个输出流,输出到客户端
        OutputStream out=response.getOutputStream();
        ImageIO.write(buf, "jpg", out);
    }
 
}
三、水印(验证码)
public class RandomServlet extends HttpServlet {
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //得到图片源(用一张图片来作为背景)
        ImageIcon img_random=new ImageIcon(super.getServletContext().getRealPath("/images/random.jpg"));
        //制作画布
        BufferedImage buf=new BufferedImage(img_random.getIconWidth(), img_random.getIconHeight(), BufferedImage.TYPE_3BYTE_BGR);
        //画笔
        Graphics g=buf.getGraphics();
        //画图
        g.drawImage(img_random.getImage(), 0, 0, null);
        //随机数,便于后面的使用
        Random r=new Random();
        //画点,画40个
        for(int i=0;i<40;i++){
            //以下面的方式设置 x,y 是为了保证点在背景的范围之内
            int x=r.nextInt(img_random.getIconWidth());
            int y=r.nextInt(img_random.getIconHeight());
            //width,height 为0才是点
            int width=0,height=0;
            //x,y 为点的坐标
            g.drawOval(x, y, width, height);
        }
        //画横线,画20条
        for(int i=0;i<20;i++){
            int x1=r.nextInt(img_random.getIconWidth());
            int y1=r.nextInt(img_random.getIconHeight());
            int x2=r.nextInt(img_random.getIconWidth());
            int y2=r.nextInt(img_random.getIconHeight());
            g.drawLine(x1, y1, x2, y2);
        }
        //创建一个数组
        String []strs={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","A","B"
                ,"C","D","e"};
        //创建一个 StringBuffer 的对象,用于把要显示的验证码拼接在这个对象上 
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<5;i++){
            sb.append(strs[r.nextInt(strs.length)]);
        }
        //设置字体的样式
        g.setColor(Color.BLACK);
        //字体的格式,字体的大小等都可以设置成随机的
        g.setFont(new Font("宋体", Font.ITALIC, 25));
        //把要显示的验证码弄到显示区域去
        g.drawString(sb.toString(), 20, 30);
        //创建一个输出流对象
        OutputStream out=response.getOutputStream();
        ImageIO.write(buf, "jpg", out);
    }
 
}