利用vCard实现电子名片扫码将个人信息保存到通讯录

可先查看基础版制作,该文是在基础版本之上实现的

一、工具类

1、FileUtils.java文件处理类

package test.controller;

import java.io.IOException;

import test.entity.Person;
import test.util.FileUtils;
import test.util.ImageUtils;
import test.util.TwoDimensionCode;

public class PersonController {
	public static void main(String[] args) throws IOException {

		Person person = new Person();
		person.setName("张三");
		person.setDepartment("销售部");
		person.setPosition("销售总监");
		person.setPhone("18888888888");
		person.setEmail("xxx@163.com");
		person.setAddress("北京市XX区XX大厦XX层XXX室");
		person.setUrl("www.xxxxxxxxx.cn");

		// 生成用户二维码
		String realPath = "L:/qrcode/";
		String mbeijing = "L:/mingpian/bg.jpg";
		String mingpian = "L:/mingpian/";
		FileUtils.createDirectory(realPath);
		FileUtils.createDirectory(mingpian);
		String name= person.getName()+".png"; //encoderImgId此处二维码的图片名
		String mname= person.getName()+".jpg";	//名片文件名
		String filePath = realPath + name;  //存放路径
		String mfilePath = mingpian + mname;  //名片存放路径
		FileUtils.copyFileCover(mbeijing, mfilePath,true);
		String content = "BEGIN:VCARD\r\nVERSION:3.0";
		content += "\r\nN:" + person.getName();
		content += "\r\nTEL:" + person.getPhone();
		content += "\r\nEMAIL;TYPE=WORK:" + person.getEmail();
		content += "\r\nORG:" + person.getPosition();
		content += "\r\nTITLE:" + person.getDepartment();
		content += "\r\nADR;TYPE=WORK:" + person.getAddress();
		content += "\r\nEND:VCARD";
		TwoDimensionCode.encoderQRCode(content, filePath, "png");// 执行生成二维码
		ImageUtils.getMingpian(filePath,mfilePath,person.getName(),person.getPosition(),person.getPhone(),person.getEmail(),person.getUrl(),person.getAddress());

	}

}

1、ImageUtils.java图像处理类

package util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;

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

public class ImageUtils {
	
	public  static void  pressImage(String pressImg, String targetImg,  int  x,  int  y)   { 
        try    { 
          File _file  =   new  File(targetImg); 
          if(!_file.exists()) 
              _file.createNewFile(); 
          Image src  =  ImageIO.read(_file); 
           int  wideth  =  src.getWidth( null ); 
           int  height  =  src.getHeight( null ); 
          BufferedImage p_w_picpath  =   new  BufferedImage(wideth, height, 
                  BufferedImage.TYPE_INT_RGB); 
          Graphics g  =  p_w_picpath.createGraphics(); 
          g.drawImage(src,  0 ,  0 , wideth, height,  null ); 

           //  水印文件  
          File _filebiao  =   new  File(pressImg); 
          Image src_biao  =  ImageIO.read(_filebiao); 
           int  wideth_biao  =  src_biao.getWidth( null ); 
           int  height_biao  =  src_biao.getHeight( null ); 
          g.drawImage(src_biao, wideth  -  wideth_biao  -  x, height  -  height_biao  - y, wideth_biao, 
                  height_biao,  null ); 
           //  /  
          g.dispose(); 
          FileOutputStream out  =   new  FileOutputStream(targetImg); 
          JPEGImageEncoder encoder  =  JPEGCodec.createJPEGEncoder(out); 
          encoder.encode(p_w_picpath); 
          out.close(); 
       }   catch  (Exception e)   { 
          e.printStackTrace(); 
      }  
  }  

    /** */ /**  
   * 打印文字水印图片 
   *  @param  pressText --文字 
   *  @param  targetImg -- 目标图片 
   *  @param  fontName -- 字体名 
   *  @param  fontStyle -- 字体样式 
   *  @param  color -- 字体颜色 
   *  @param  fontSize -- 字体大小 
   *  @param  x -- 偏移量 
   *  @param  y 
    */  
    
    public   static   void  pressText(String pressText, String targetImg, String fontName, int  fontStyle,  int  color,  int  fontSize,  int  x,  int  y)   { 
        try    { 
          File _file  =   new  File(targetImg); 
          Image src  =  ImageIO.read(_file); 
           int  wideth  =  src.getWidth( null ); 
           int  height  =  src.getHeight( null ); 
          BufferedImage p_w_picpath  =   new  BufferedImage(wideth, height, 
                  BufferedImage.TYPE_INT_RGB); 
          Graphics g  =  p_w_picpath.createGraphics(); 
          g.drawImage(src,  0 ,  0 , wideth, height,  null ); 
           //  String s="www.qhd.com.cn";  
          g.setColor(Color.RED); 
          g.setFont(new  Font(fontName, fontStyle, fontSize)); 
        

          g.drawString(pressText, wideth - fontSize  -  x, height  -  fontSize / 2   -  y); 
          g.dispose(); 
          FileOutputStream out  =   new  FileOutputStream(targetImg); 
          JPEGImageEncoder encoder  =  JPEGCodec.createJPEGEncoder(out); 
          encoder.encode(p_w_picpath); 
          out.close(); 
       }   catch  (Exception e)   { 
          System.out.println(e); 
      }  
  }  
	
    //坐标中图片是右下角   文字以左上角为中心
    public   static   void  pressText(String targetImg,String name,String position,String phone,String email,String url,String addr) throws IOException   { 
    	BufferedImage buffImg = ImageIO.read(new File(targetImg));
        Graphics2D g = (Graphics2D) buffImg.getGraphics();

        //设置抗锯齿,防止图片或文字模糊
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //绘制文字
        Font f = new Font("黑体",Font.BOLD,55);
        Font f1 = new Font("黑体",Font.PLAIN,27);
        Font f2 = new Font("Arial Unicode MS",Font.PLAIN,27);
        g.setColor(new Color(6, 73, 154));
        g.setFont(f);
        g.drawString(name,110,480);
        g.setFont(f1);
        g.drawString(position,118,530);
        g.setColor(new Color(91, 91, 91));
        g.drawString("手机:"+phone,565,467);
        g.drawString("邮箱:",565,513);
        g.drawString("官网:",565,559);
        g.setFont(f2);
        g.drawString(email,650,513);
        g.drawString(url,650,559);
        g.setFont(f1);
        g.drawString("地址:"+addr,565,605);
        ImageIO.write(buffImg,"jpg", new File(targetImg));
    }
    
    /*
     * 生成名片
     */
    public   static   void  getMingpian(String pressImg,String targetImg,String name,String position,String phone,String email,String url,String addr) throws IOException   { 
    	pressImage(pressImg,targetImg,85,400);
    	pressText(targetImg, name, position, phone, email, url, addr);
    }

	 
}

二、实现类

PersonMain.java实现类

package test.controller;

import java.io.IOException;

import test.entity.Person;
import test.util.FileUtils;
import test.util.ImageUtils;
import test.util.TwoDimensionCode;

public class PersonController {
	public static void main(String[] args) throws IOException {

		Person person = new Person();
		person.setName("张三");
		person.setDepartment("销售部");
		person.setPosition("销售总监");
		person.setPhone("18888888888");
		person.setEmail("xxx@163.com");
		person.setAddress("北京市XX区XX大厦XX层XXX室");
		person.setUrl("www.xxxxxxxxx.cn");

		// 生成用户二维码
		String realPath = "L:/qrcode/";
		String mbeijing = "L:/mingpian/bg.jpg";
		String mingpian = "L:/mingpian/";
		FileUtils.createDirectory(realPath);
		FileUtils.createDirectory(mingpian);
		String name= person.getName()+".png"; //encoderImgId此处二维码的图片名
		String mname= person.getName()+".jpg";	//名片文件名
		String filePath = realPath + name;  //存放路径
		String mfilePath = mingpian + mname;  //名片存放路径
		FileUtils.copyFileCover(mbeijing, mfilePath,true);
		String content = "BEGIN:VCARD\r\nVERSION:3.0";
		content += "\r\nN:" + person.getName();
		content += "\r\nTEL:" + person.getPhone();
		content += "\r\nEMAIL;TYPE=WORK:" + person.getEmail();
		content += "\r\nORG:" + person.getPosition();
		content += "\r\nTITLE:" + person.getDepartment();
		content += "\r\nADR;TYPE=WORK:" + person.getAddress();
		content += "\r\nEND:VCARD";
		TwoDimensionCode.encoderQRCode(content, filePath, "png");// 执行生成二维码
		ImageUtils.getMingpian(filePath,mfilePath,person.getName(),person.getPosition(),person.getPhone(),person.getEmail(),person.getUrl(),person.getAddress());

	}
}

ps:二维码内存储的信息过多会导致二维码密度变大不易识别和整体面积变大,请谨慎选择存储内容

三、效果

1、背景图,有需要可自取
在这里插入图片描述

2、电子名片效果
在这里插入图片描述

总结

到此,该功能已实现,进阶版完整版代码,不方便下载的私信留邮箱,看到后回复

创作不易,感谢支持,欢迎关注博主公众号,不定期进行干货分享
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值