带动态背景图的二维码生成器

BitQR-Code

Through image generate QR-Code .

一个优雅的 QR 二维码生成器

Github项目地址 : https://github.com/CasterWx/BitQR-Code


样例

拿起你的手机扫描下面的二维码试试吧!

原图 Version-3
Version-5 直接拼凑GIF 分解生成
原图1 原图2 原图3
GIF1 GIF2 GIF3

GIF分解为多个帧

原GIF 第四帧 第七帧 第十帧
第十三帧 第十六帧 第二十帧 生成GIF

2018年最后一天的最后一篇

引用

在项目中导入 QRCode.jar 以添加依赖:

<component name="libraryTable">
  <library name="QRCode">
    <CLASSES>
      <root url="jar://$PROJECT_DIR$/src/lib/QRCode.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>
</component>

快速上手

1. "快速导入背景图片"

只想显示一张麻衣学姐的照片

BufferedImage writeImg = ImageIO.read(new File("麻衣学姐.jpg"));
BufferedImage bf = new BufferedImage(writeImg.getWidth(),writeImg.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bf.createGraphics() ;
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

writeImg是读取到的图片,然后根据这张照片创建Graphics的大小。

gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

便可以将writeImg绘制到Graphics中了。

File imagefile = new File(imgPath);
ImageIO.write(bf,"png",imagefile);

现在就可以利用ImageIO将图片存储到本地了

效果

2. "图片中使用画笔"

Graphics2D gs = bf.createGraphics() ;
gs.setBackground(Color.white);
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);

gs是创建出的画布,setBackground可以设置其背景色,也可以直接drawImage()将图片绘制进去。

gs.setColor(Color.BLACK);
gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
gs.fillRect(j*mini+begin,i*mini+begin,mini,mini );
  • setColor用于设置画笔颜色。
  • setComposite用于设置透明度
  • fillRect是绘制动作,参数值为起始坐标和结束坐标。

3. "二维码的本质是_______"

二维码的本质是二进制表示数据

二维码的黑白格,其实就代表了0和1两位数据,我们只需要将数据转化为bytes数组,然后根据数组的0-1值直接绘制到图片上,即可生成相应的二维码。

byte []contentByte = "需要表示的数据".getBytes("utf-8");
boolean [][]cidesOut = qrcode.calQrcode(contentByte) ;

这样就可以生成一个cidesOut数组来表示二维码的黑白格。

qrcode是二维码的生成配置,容错率和Qrcode版本等。

Qrcode qrcode = new Qrcode();
qrcode.setQrcodeErrorCorrect('M');
qrcode.setQrcodeEncodeMode('B');
qrcode.setQrcodeVersion(3);

4. "黑白格衬衫!!!"

二维码的本质是黑白格衬衫!!!

双层for循环遍历cidesOut这个boolean数组,如果是true就绘制黑色。

 for(int i=0;i<cidesOut.length;i++){
    for(int j=0;j<cidesOut.length;j++){
        if(cidesOut[j][i]){
            gs.fillRect(j*mini+begin,i*mini+begin,mini,mini );
        }
    }
}

GIF动画帧绘制

1. "如何绘制一个GIF"

AnimatedGifEncoder e = new AnimatedGifEncoder();
e.setRepeat(0);
e.start(newPic);
BufferedImage src[] = new BufferedImage[pic.length];
for (int i = 0; i < src.length; i++) {
    e.setDelay(playTime);
    src[i] = ImageIO.read(new File(pic[i]));
    e.addFrame(src[i]);  //添加到帧中
}
e.finish();

首先定义一个GIF生成类.

AnimatedGifEncoder e = new AnimatedGifEncoder();

e.start(newPic);

newPic代表最后生成的gif文件名.

e.setDelay(playTime);

设置播放的延迟时间playTime.

e.setDelay(playTime);

src[i] = ImageIO.read(new File(pic[i]));
e.addFrame(src[i]);

最后将BufferedImage图片添加到帧中.

e.finish();

GIF

2. "如何分解一个GIF"

  • 加载gif
GifDecoder gd = new GifDecoder();//要处理的图片
int status = gd.read(new FileInputStream(new File("marry.gif")));
if (status != GifDecoder.STATUS_OK) {
  return;
}
  • GIF帧数为gd.getFrameCount();

我们可以直接获取每一帧的图片并且保存到本地。

for (int i = 0; i < gd.getFrameCount(); i++) {
  //取得gif的每一帧
  BufferedImage frame = gd.getFrame(i);
  // 存储frame到本地
}

可以将一个GIF分解成帧之后,我们就可以将这一帧添加二维码,然后加入到一个新的GIF中了。

  for (int i = 0; i < gd.getFrameCount(); i++) {
    //取得gif的每一帧
    BufferedImage frame = gd.getFrame(i);
    Graphics2D gs = frame.createGraphics() ;
    gs.drawImage(frame,0,0,frame.getWidth(),frame.getHeight(),null);
    int qrLength = frame.getHeight()-2*frame.getHeight()/10 ;
    int mini = qrLength/cidesOut.length ;
    int begin = (frame.getWidth() - mini*cidesOut.length)/2 ;
    for(int k=0;k<cidesOut.length;k++){
      for(int j=0;j<cidesOut.length;j++){
        if(cidesOut[j][k]){
          gs.setColor(Color.BLACK);
          gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
          gs.fillRect(j*mini+begin,k*mini+begin/4,mini,mini );
        }
      }
    }

  int delay = gd.getDelay(i);
  ge.setDelay(delay);
  ge.addFrame(frame);
原图 GIF
原图 GIF
原图 GIF

原文地址:https://www.cnblogs.com/LexMoon/p/qrcode.html

时间: 2024-10-14 10:40:18

带动态背景图的二维码生成器的相关文章

生成带内嵌图片的二维码

在博问上看到有同学在问如何实现一个带内嵌图片的二维码,所以准备记录下来,供同学们参考. 1.首先准备一个用于内嵌的图片. 2.既然生成二维码码,那肯定需要将什么样的内容生成二维码,这里我用http://www.baidu.com作为生成二维码的字符串 private string QcodeSource { get { return "http://www.baidu.com"; } } 3.我们来看看根据QcodeSource生成二维码的方法,这里返回Byte[].PS:这里用了 G

python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询.cmd版的实时翻译.快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给大家分享一个二维码生成器的爬虫版本实现! 爬虫思路 网上有很多的二维码自动生成的网页,它可以将文本.名片.wifi分享等等都以二维码的形式生成,只需要用带有识别二维码的app就可以识别,比如手机浏览器一般就自带app哦! PS:这里,普及一个很重要点,不要用带有支付功能的app随便扫码(支付宝.微信等等)!!!

小白C#窗体系列-02.二维码生成器

今天是情人节,咳,男人们带着他们的男朋友们,女人带着她们的女朋友们愉快的逛着街.逆天也就不随大众了,就继续出C#小白系列的教程了~~~ 实在没空去录教程了,就看看文档吧,大家都知道的,录教程是比较花时间的,我不想草草了事,那是对大家和我自己的不负责,视频可以以后再录,不过软件和源码以及文档得先弄好,毕竟逆天不喜欢失信与自己~~ 废话不说了,开始我们的教程吧~ 软件下载(.NET 4.0 框架)http://pan.baidu.com/s/1i3BUVNv[源码看下面] 一.设计图纸: 二.代码分

c++ 依据输入动态声明数组(一维,二维)

较早的编译器是不同意这样做的,所以一些书籍比方以Tc解说的书本都说数组的下标不能是变量.在vc6.0下亦是如此. 只是在一些较新的编译器如dev c++已经支持了,例如以下代码不会报错 #include <stdio.h> #include <stdlib.h> int main() { int a; int i; scanf("%d",&a); int c[a]; for( i =0 ;i<a;i++) scanf("%d",

二维码生成器和解析器-java

1.工具zxing2.1----下载地址:http://code.google.com/p/zxing/downloads/detail?name=ZXing-2.1.zip&can=2&q= 所有版本下载地址:http://code.google.com/p/zxing/downloads/list 2.需要的jar包,zxing的core.jar和zxing的javase.jar这两个jar包在zxing2.1版本中地址是 zxing/zxingorg/web/WEB-INF/lib里

C#版的二维码生成器

这里是二维码的介绍http://blog.sina.com.cn/s/blog_4d8333670100t8mr.html 下面是我用C#作为后台代码做的一个二维码生成器的代码: 前端: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="main.aspx.cs" Inherits="二维码生成器.main" %> <!DOCTYPE html

小程序参数二维码生成器

微信小程序支持带参数二维码,好推二维码的HotApp小程序统计针对这个功能推出了小程序带参数二维码生成器 输入微信的page 和参数,就可以生成小程序带参数二维码了. www.hotapp.cn

PHP二维码生成器

PHP二维码生成器 (1)       在官网上下载PHPQR Code类库,下载源文件并解压到phpqrcode目录下. (2)创建脚本文件create_png.php在页面上添加用户表单,代码如下: <form method="post"> 输入文本:<inputtype="text" name="info"><br> 请选择大小:<selectname='size'> <? for($i

二维码生成器(来源黑白猪的博客)

<!doctype html><html><head> <meta charset="utf-8"> <title>二维码生成</title> <meta name="viewport" content="initial-scale=1, width=device-width, maximum-scale=1, user-scalable=no" /> <m