• 缘由  

  促使草人写这一系列(将会是)文章的原因是二维码现在很流行,很容易接触到,而且二维码又是那么容易就生成——就不说有很多在线的生成器,许多应用软件也都有生成二维码的功能,比如Firefox浏览器、QQ等。

  最初的时候,草人看到QQ生成的花哨的二维码就想自己写出生成自己喜欢的二维码的程序。

  

  • 恶搞

  当我开始去了解二维码(后来主要是QR code)的时候,我知道QR code(QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。——来自百度百科)并不是那么容易的实现,为什么不容易盗用一张高格逼的图就能解释了

  

  要是盯着这些图看,都要被吓住了,整个很牛的样子(没说不牛啊)。所以决定先恶搞一番,就是先弄出一张看似二维码的图。

  

 package spoofQRcode;

 import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO; public class CreatQRImage2 { public static String m_content = null;
private static String[] m_numCoding = {"0000","0001","0010","0011","0100","0101","0110","0111","1000",
"1001"};
private static String m_strCoding = null; public CreatQRImage2(String content){
this.m_content = content;
numToStrCoding();
}
public static void numToStrCoding(){
for(int n = 0;n < m_content.length();n++)
{for (int i = 0; i < m_numCoding.length ;i++){
//System.out.println(content.charAt(n)+1);
if(m_content.charAt(n)-48 == i)
{
//System.out.println("ok");
//System.out.println(numCoding[i]);
m_strCoding += m_numCoding[i];
break;
}
else continue;
}
}
}
public static void creat(int imgSize,String imageFormat,String toPath)throws IOException{
FileOutputStream fos = null;
BufferedImage buffImg = null;
try{ buffImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
Graphics2D gs = buffImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, imgSize, imgSize);
gs.setColor(Color.BLACK);
for(int i = 0;i <= 6;i++)
for(int j = 0;j <= 6;j++)
if(i==0||j==0||i==6||j==6)
{gs.fillRect(i*8,j*8,8,8);}
for(int i = 14;i <= 20;i++)
for(int j = 0;j <= 6;j++)
if(i==14||j==0||i==20||j==6)
{gs.fillRect(i*8,j*8,8,8);}
for(int i = 0;i <= 6;i++)
for(int j = 14;j <= 20;j++)
if(j==14||i==0||j==20||i==6)
{gs.fillRect(i*8,j*8,8,8); }
gs.fillRect(2*8,2*8,24,24);
gs.fillRect(16*8,2*8,24,24);
gs.fillRect(2*8,16*8,24,24);
//gs.setColor(Color.blue);
int strCodingIndex = 4;
int x = 0;
int y = 0;
for(int k = strCodingIndex;k < m_strCoding.length();k++){
//System.out.println("ok?");
//System.out.println(strCoding.charAt(k));
if(x > 20)
{
y += 1;
x -= 20;
}
if(!(x<7&&y<7)&&!(13<x&&y<7)&&!(13<y&&x<7))
gs.fillRect(x*8,y*8,
(m_strCoding.charAt(k)-48)*8,(m_strCoding.charAt(k)-48)*8);
x++;
if(x==21&&y==20&&k<m_strCoding.length()){
System.out.println("Oversize!");
strCodingIndex = k;
break;
}
if(x<21&&y<=20&&k==m_strCoding.length()-1){
System.out.println("Small Data!");
strCodingIndex = k;
break;
} } gs.dispose();
buffImg.flush();
fos=new FileOutputStream(toPath);
ImageIO.write(buffImg, imageFormat, fos);
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(fos!=null){
fos.close();
}}
} public static void main(String[] args) throws IOException{
int imgSize = 168;
String imageFormat = "png";
String toPath = "F:/z27.png";
String content = "15162100138093948324385427385237923464085535342427"
+ "524378523234233343425673143325889543465754602394784752937307";
CreatQRImage2 obj = new CreatQRImage2(content);
obj.creat(imgSize,imageFormat,toPath); }
}

  这样的话可以得到这样的结果——

  

  • 言归正传

  我知道你会说“瞎了我的狗眼了”,这都是啥,首先不说代码(不能直视,我只是图个方便),这二维码也不能扫啊。先消消气,我且慢慢道来……

  1.你看图是不是已经有个“二维码”的外貌了(别仔细看)?OK,那么也就是说至少某些地方对了。

  2.再说说我的想法,生成二维码图,就是在一张“白布”上写上一些由黑白(深浅)的块,“黑块”(深色)代表“1”,“白块”(浅色)代表“0”,这样就可以存储数据了。

  

buffImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
Graphics2D gs = buffImg.createGraphics();
gs.setBackground(Color.WHITE);
gs.clearRect(0, 0, imgSize, imgSize);

“白布”

gs.setColor(Color.BLACK);
gs.fillRect(x,y,width,height);

"黑块"

  

  3.至于最大的问题就是,”白布“上”黑块“(深色)、”白块“(浅色)的规则和算法。要能够被其他方提供的扫描器识别,格式就得标准化。要使生成的二维码能”quick response"等就需要算法。

  • 下一篇

  如果草人这样瞎扯你没法忍了,当然也可以是对二维码产生兴趣了,那先看看http://wenku.baidu.com/link?url=0BOpyLC5YOUTmdip7PlHIWOUihTQKQJJyVE_0Em9lEZda94FgGHROYrMtCoTN1oozw5gc-YPrgtAYabWgh1QbbYJAdu3YXb8wdug_YPuFWG(QRCode 编码解码标准)。这样的话,下一篇应该就是实现了。

特别声明:转载请注明原始链接

QR code 乱谈(一)的更多相关文章

  1. 二维码详解(QR Code)

    作者:王子旭链接:https://zhuanlan.zhihu.com/p/21463650来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 2016.7.5 更新:长文 ...

  2. C++矢量图形库系列(1)——矢量图形库乱谈(转)

    转自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html 本系列篇章的主要内容是讲解矢量图形库的编译.开发和使用.并不对他们周边的内容做过多的描述 ...

  3. [转]vnpy乱乱谈 02架构

    vnpy乱乱谈 02架构 转自:http://101.132.65.227/?p=51 听到架构这个词先不要害怕. 其实这部分内容还是挺简单的. 一般而言, 一个交易系统我们可以简单的分成输入, (系 ...

  4. JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈

    C 和 C++ 之类的编译语言性能远超Java,但是生成的代码只能在有限的几种系统上执行,这就有了Java的存在基础(JVM-跨平台) 早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之 ...

  5. C#通过第三方组件生成二维码(QR Code)和条形码(Bar Code)

    用C#如何生成二维码,我们可以通过现有的第三方dll直接来实现,下面列出几种不同的生成方法: 1):通过QrCodeNet(Gma.QrCodeNet.Encoding.dll)来实现 1.1):首先 ...

  6. 使用PHP QR Code生成二维码

    使用PHP QR Code生成二维码   HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.so ...

  7. 微软ASP.NET技术“乱谈”

    微软ASP.NET技术“乱谈” 2014新年了,顺手写的一点文字,主要谈谈我对当前微软ASP.NET技术的看法,比较随意,大伙儿随便看看吧. 1 当前微软Web平台技术全貌 从2002年发布.NET ...

  8. Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例

    这个实例在windows.OS X.IOS和Android等平台运行正常.本文参考这个网站提供的方法:http://zarko-gajic.iz.hr/firemonkey-mobile-androi ...

  9. 优测优社区干货精选|老司机乱谈编辑器之神——vim

    文 / 腾讯 吴双 前言 优测小优 有话说: 腾讯优测只有应用测试大神?不不不,我们还有各种研发大牛! *** vim 是一种信仰,我自从2004年有了这个信仰,已经12个年头了.本文介绍了学习vim ...

随机推荐

  1. Http抓包工具Charlse使用教程

    [原文]http://blog.csdn.net/wildfireli/article/details/19829479 Charles是目前最强大的http调试工具,在界面和功能上远强于Fiddle ...

  2. Unix网络编程(1)——socket一窥

    套接口地址结构 IPv4的套接口地址结构为: struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; struct in_addr ...

  3. javah 生成header file 报错 问题解决

    环境:Android Studio, Mac OS 目标: 用javah 为MainActivity.class 生成 jni header 文件 正确的命令是 cd <class文件的路径&g ...

  4. Matlab中plot、fplot、ezplot的使用方法和区别

    函数plot 是绘制二维图形的最基本函数,它是针对向量或矩阵的列来绘制曲线的.也就是说,使用plot 函数之前,必须首先定义好曲线上每一点的x 及y 坐标; 常用格式为: (1)plot(x) 当x ...

  5. LintCode 55 比较字符串

    比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 注意事项 在 A 中出现的 B 字符串里的字符不需要连续或者有序.   样例 给出 A = "ABC ...

  6. 程序员你该学学如何设计PPT了,设计PPT的几大原则

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 大量的汇报及介绍工作,都离不开一个辅助工具-P ...

  7. IIS经典模式和集成模式在管道模型中的不同

    问题: 有时候我们配置IIS后可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 其中由 ...

  8. 月下载量上千次的APP源码分享

    在360上面上线了一个月,下载量上千余次.这里把代码都分享出来,供大家学习哈!还包括教大家如何接入广告,赚点小钱花花,喜欢的帮忙顶一个,大神见了勿喷,小学僧刚学Android没多久. 首先介绍这款应用 ...

  9. Android屏幕保持唤醒状态

    我们程序偶尔会有需要屏幕一直或较长时间的保持唤醒状态,而用户的睡眠时间又设置的比较短.这时可能会对程序以及用户的使用造成一定的影响.在Android中有两种方法,可以让我们在我们需要保持唤醒的页面长时 ...

  10. eclipse中启动Genymotion模拟器的错误

    错误程序: Output file: C:\Users\wishwzp\.genymotion-eclipse.logLoading Genymotion libraryGenymotion dire ...