博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 实现读取图片尺寸、生成水印和生成验证码方法
阅读量:5798 次
发布时间:2019-06-18

本文共 5541 字,大约阅读时间需要 18 分钟。

hot3.png

Java 实现生成水印,生成验证码,读取图片尺寸的方法,在Android项目开发中,如果要实现瀑布流类似的布局,不得不进行提前获取图片尺寸。

另外图片水印和验证码也有很多用处,验证码和水印的原理类似,无非就是图形的绘制,这里只说说验证码即可

--------实现图片尺寸的读取--------

/** *  */package com.b510;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.Date;import java.util.Iterator;import javax.imageio.ImageIO;import javax.imageio.ImageReader;import javax.imageio.stream.ImageInputStream;public class ImageUtil {    /**     * 源图片路径名称如:c:/1.jpg     */    private String srcpath = "e:/pool.jpg";    public ImageUtil() {    }    public static void main(String[] args) throws Exception {        ImageUtil util = new ImageUtil();        util.getImageSizeByImageReader(util.getSrcpath());        util.getImageSizeByBufferedImage(util.getSrcpath());    }    /**     * 使用ImageReader获取图片尺寸     *      * @param src     *            源图片路径     */    public void getImageSizeByImageReader(String src) {        long beginTime = new Date().getTime();        File file = new File(src);        try {            Iterator
 readers = ImageIO.getImageReadersByFormatName("jpg");            ImageReader reader = (ImageReader) readers.next();            ImageInputStream iis = ImageIO.createImageInputStream(file);            reader.setInput(iis, true);            System.out.println("width:" + reader.getWidth(0));            System.out.println("height:" + reader.getHeight(0));        } catch (IOException e) {            e.printStackTrace();        }        long endTime = new Date().getTime();        System.out.println("使用[ImageReader]获取图片尺寸耗时:[" + (endTime - beginTime)+"]ms");    }    /**     * 使用BufferedImage获取图片尺寸     *      * @param src     *            源图片路径     */    public void getImageSizeByBufferedImage(String src) {        long beginTime = new Date().getTime();        File file = new File(src);        FileInputStream is = null;        try {            is = new FileInputStream(file);        } catch (FileNotFoundException e2) {            e2.printStackTrace();        }        BufferedImage sourceImg = null;        try {            sourceImg = javax.imageio.ImageIO.read(is);            System.out.println("width:" + sourceImg.getWidth());            System.out.println("height:" + sourceImg.getHeight());        } catch (IOException e1) {            e1.printStackTrace();        }        long endTime = new Date().getTime();        System.out.println("使用[BufferedImage]获取图片尺寸耗时:[" + (endTime - beginTime)+"]ms");    }    public String getSrcpath() {        return srcpath;    }    public void setSrcpath(String srcpath) {        this.srcpath = srcpath;    }}

------实现验证码-------

public class RandomValidateCode {    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";//放到session中的key    private Random random = new Random();    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串        private int width = 80;//图片宽    private int height = 26;//图片高    private int lineSize = 40;//干扰线数量    private int stringNum = 4;//随机产生字符数量    /*     * 获得字体     */    private Font getFont(){        return new Font("Fixedsys",Font.CENTER_BASELINE,18);    }    /*     * 获得颜色     */    private Color getRandColor(int fc,int bc){        if(fc > 255)            fc = 255;        if(bc > 255)            bc = 255;        int r = fc + random.nextInt(bc-fc-16);        int g = fc + random.nextInt(bc-fc-14);        int b = fc + random.nextInt(bc-fc-18);        return new Color(r,g,b);    }    /**     * 生成随机图片     */    public void getRandcode(HttpServletRequest request,            HttpServletResponse response) {        HttpSession session = request.getSession();        //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);        Graphics g = image.getGraphics();//产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作        g.fillRect(0, 0, width, height);        g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));        g.setColor(getRandColor(110, 133));        //绘制干扰线        for(int i=0;i<=lineSize;i++){            drowLine(g);        }        //绘制随机字符        String randomString = "";        for(int i=1;i<=stringNum;i++){            randomString=drowString(g,randomString,i);        }        session.removeAttribute(RANDOMCODEKEY);        session.setAttribute(RANDOMCODEKEY, randomString);        System.out.println(randomString);        g.dispose();        try {            ImageIO.write(image, "JPEG", response.getOutputStream());//将内存中的图片通过流动形式输出到客户端        } catch (Exception e) {            e.printStackTrace();        }    }    /*     * 绘制字符串     */    private String drowString(Graphics g,String randomString,int i){        g.setFont(getFont());        g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));        String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));        randomString +=rand;        g.translate(random.nextInt(3), random.nextInt(3));        g.drawString(rand, 13*i, 16);        return randomString;    }    /*     * 绘制干扰线     */    private void drowLine(Graphics g){        int x = random.nextInt(width);        int y = random.nextInt(height);        int xl = random.nextInt(13);        int yl = random.nextInt(15);        g.drawLine(x, y, x+xl, y+yl);    }    /*     * 获取随机的字符     */    public String getRandomString(int num){        return String.valueOf(randString.charAt(num));    }}

转载于:https://my.oschina.net/ososchina/blog/376535

你可能感兴趣的文章
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
优秀程序员共有的7种优秀编程习惯
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
开发者论坛一周精粹(第五十五期) 全站HTTPS之OSS教程 一次可以备案几个网站?...
查看>>
(干货)Linux学习资源推荐
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
C#字符串的不变性
查看>>
前端路由简介以及vue-router实现原理
查看>>
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)...
查看>>
分享15款很实用的 Sass 和 Compass 工具
查看>>