CODE128 码

CODE128码是广泛应用在企业内部管理、生产流程、物流控制系统方面的条码码制,由于其优良的特性在管理信息系统的设计中被广泛使用,CODE128码是应用最广泛的条码码制之一。
CODE128码是1981年引入的一种高密度条码,CODE128 码可表示从 ASCII 0 到ASCII 127 共128个字符,故称128码。其中包含了数字、字母和符号字符;

CODE128 码的特点:
•可表示高密度数据和字符串;
•每个字符由3个条、3个空、11个单元构成,字符串可变长;
•符号内含校验码;
•有三种不同的版本:A(数字、大写字母、控制字符)B(数字、大小字母、字符)C(双位数字)
•可用128个字符分别在A、B或C三个字符串集合中。
CODE128 码与CODE39码的区别:
Code 128码与Code 39码有很多的相近性,都广泛运用在企业内部管理、生产流程、物流控制系统方面。不同的在于Code 128比Code 39能表现更多的字符,单位长度里的编码密度更高。当单位长度里不能容下Code 39编码或编码字符超出了Code 39的限制时,就可选择Code 128来编码。所以Code 128比Code 39更具灵性。

为什么广泛使用CODE128码:
由于CODE128码可表示较全面的字符(数字、字母和符号),在同样长度的条码中可容纳的字符长度较长(高密度),条码长度与字符串长度无明显的敏感性,所以CODE128码是企业内部管理系统最为广泛使用的条码码制。

条形码就是我们看到的商品上有的那些竖条条。
要不是项目上用到这个或许我一辈子也不会对那个感兴趣。
条形码其实是分成很多类的,虽然他们看起来都差不多……

常见的条形码的码制被称为39码、128码、417码等等。
我今天主要讲的是128码即CODE128。
Code128码其实还分成三类,即128A、128B、128C。它们的区别就是对应的字符表不一样。
那么Code128码到底怎么读呢?请看下面的图:
123222

从左往右是黑白相间的条形码,黑的叫“条”(B),白的叫“空”(S)。
如果你仔细看,条和空都有4种不同的宽度。我们将它从细到粗赋予1、2、3、4这几个值。
然后我们开始按照粗细的值来阅读条码、结果如下: 211232231131221213131222212222221224121213121211321132331112
注意这个结果是黑白相间的。

别只顾着读“条”忘了都空。这边总共有61位。

Code128码有一个头一个尾。
尾总是2331112,这代表Code128已经结束。
其余的部分是6位为一个块,包括头。
头有3种:A)211412 B)211214 C)211232 。这分别表示此Code128是什么类型的。(ABC其中一种)

我们将我们读出来的码,去掉头和尾,重新分一次块: 231131 | 221213 | 131222 | 212222 | 221224 | 121213 | 121211 | 32113 正好是6位为一块。
其中最后一个块(除去尾段)是校验位,用于检查该条形码是否被正确编码。

然后,我们有一个字符表。(应该说是我有这张表)这张字符对应各个编号是表示的什么。
我们这个是Code128C型。C型码是纯数字的,每个块对应2位数字。 查表可得 50 09 05 00 01 91 91 。

有了这些知识,我们就可以尝试去写一个程序去生成条形码和识别条形码。
其实生成是比较简单的,而识别就比较麻烦了。通常超市是使用条码枪,通过光学原理来识别的,因为黑白条纹的反光特性不一样。
要是用软件对图像进行识别,会有些麻烦。但是,这正是我们要做的

使用tesseract-ocr破解网站验证码

首先我得承认,关注tesseract-ocr, 是冲着下面这篇文章的噱头去的,26行groovy代码破解网站验证码

Breaking Weak CAPTCHA in… slightly more than 26 Lines of Groovy Code

当然,看了之后才知道,原来是调用了三方库tesseract-ocr……
http://code.google.com/p/tesseract-ocr/

尽管如此,本着邓爷爷的“不管白猫黑猫,能抓住老鼠的就是好猫”的原则,趁着假期也开始了“文字识别”的初级研究

HP的tesseract最近被Google支持并开支持英文字母和数字,据说辨识程度是世界排名第三的;更难能可贵的是,提供多国语言包下载(包括中文,精度不咋的倒是真的……),并自带训练工具。

安装完并跑过自带例子之后,首先想到的应用自然是用于验证码分析

按照说明,送入tesseract的图片的质量直接影响识别的效果,因此,简单的预处理是不可或缺的

1.首先灰度化,灰度值=0.3R+0.59G+0.11B:
Java代码 收藏代码

for (int y = minY; y < height; y++) { for (int x = minX; x < width; x++) { int rgb = srcImg.getRGB(x, y); Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。 int gray = (int) (0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue()); Color newColor = new Color(gray, gray, gray); srcImg.setRGB(x, y, newColor.getRGB()); } } 结果如图: 2.其次是灰度反转: Java代码 收藏代码 for (int y = minY; y < height; y++) { for (int x = minX; x < width; x++) { int rgb = buffImg.getRGB(x, y); Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。 Color newColor = new Color(255 - color.getRed(), 255 - color .getGreen(), 255 - color.getBlue()); buffImg.setRGB(x, y, newColor.getRGB()); } } 结果如图: 3.再次是二值化,取图片的平均灰度作为阈值,低于该值的全都为0,高于该值的全都为255: Java代码 收藏代码 for (int y = minY; y < height; y++) { for (int x = minX; x < width; x++) { int rgb = buffImg.getRGB(x, y); Color color = new Color(rgb); // 根据rgb的int值分别取得r,g,b颜色。 int value = 255 - color.getBlue(); if (value > average) {
Color newColor = new Color(0, 0, 0);
buffImg.setRGB(x, y, newColor.getRGB());
} else {
Color newColor = new Color(255, 255, 255);
buffImg.setRGB(x, y, newColor.getRGB());
}
}
}

结果如图:

看看效果还凑合,就省却尺寸调整、中值滤波以及噪点去除等步骤了。

以上完成图片预处理工作;Tesseract没有开放api,纯命令行调用:
Java代码 收藏代码

List cmd = new ArrayList(); // 存放命令行参数的数组
cmd.add(tessPath + “\\tesseract”);
cmd.add(“”);
cmd.add(outputFile.getName()); // 输出文件位置
cmd.add(LANG_OPTION); // 字符类别
cmd.add(“eng”); // 英文,找到tessdata里对应的字典文件。
ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());

cmd.set(1, tempImage.getName()); // 把图片文件位置放在第一个位置

pb.command(cmd); // 执行命令行
pb.redirectErrorStream(true); // 通知进程生成器是否合并标准错误和标准输出,把进程错误保存起来。
Process process = pb.start(); // 开始执行进程

int w = process.waitFor(); // 当前进程停止,直到process停止执行,返回执行结果.

结果输出表示一切正常

当然,真正要用好tesseract-ocr,还需用到其强大地训练工具,就是后话了……

另外,关于文字识别,除去作为破解验证码的反制手段之外,我们是否也有相关的应用呢?

Tesseract 3 语言数据的训练方法

需要用到的程序

(1) Tesseract 3.00
(2) Tesseract 3.00 Bugfix
(3) CowBoxer 1.01
(4) Universal Extractor 1.61 (非必需)

使用 Universal Extractor 将 Tesseract 的安装包解开,再用 Bugfix 里的 tesseract.exe 覆盖原来的主程序,Tesseract 就可用了。CowBoxer 是用于修改 box 文件的程序。

生成第一个 box 文件

演示中将 Tesseract 解压到了 E:\tesseract-ocr 目录。然后在该目录中建立了一个 build 目录用于存放原始数据和训练过程中生成的文件。原始图片数据一个有 3 个 (test.001.tif – test.003.tif):

首先生成第一个图片 test.001.tif 的 box 文件,这里使用官方的 eng 语言数据进行文字识别:

E:\tesseract-ocr\build>..\tesseract test.001.tif test.001 -l eng batch.nochop makebox
Tesseract Open Source OCR Engine with Leptonica
Number of found pages: 1.

执行完这个命令之后,build 目录下就生成了一个 test.001.box。使用 CowBoxer 打开这个 box 文件,CowBoxer 会自动找到同名的 tif 文件显示出来。

CowBoxer 的使用方法可以看 Help -> About 中的说明。修改完成之后 File -> Save box file 保存文件。

生成初始的 traineddata

接下来使用这一个 box 文件先生成一个 traineddata,在接下来生成其他图片的 box 文件时,使用这个 traineddata 有利于提高识别的正确率,减少修改次数。

..\tesseract test.001.tif test.001 nobatch box.train
..\training\unicharset_extractor test.001.box
..\training\mftraining -U unicharset -O test.unicharset test.001.tr
..\training\cntraining test.001.tr
rename normproto test.normproto
rename Microfeat test.Microfeat
rename inttemp test.inttemp
rename pffmtable test.pffmtable
..\training\combine_tessdata test.

在 build 目录下执行完这一系列命令之后,就生成了可用的 test.traineddata。

生成其余 box 文件

将上一步生成的 test.traineddata 移动到 tesseract-ocr\tessdata 目录中,接下来生成其他 box 文件时就可以通过 -l test 参数使用它了。

..\tesseract test.002.tif test.002 -l test batch.nochop makebox
..\tesseract test.003.tif test.003 -l test batch.nochop makebox

这里仅仅是使用 3 个原始文件作为例子。实际制作训练文件时,什么时候生成一个 traineddata 根据情况而定。中途生成 traineddata 的目的只是为了提高文字识别的准确率,使后面生成的 box 文件能少做修改。

生成最终的 traineddata

在所有的 box 都制作完成后,就可以生成最终的 traineddata 了。

..\tesseract test.001.tif test.001 nobatch box.train
..\tesseract test.002.tif test.002 nobatch box.train
..\tesseract test.003.tif test.003 nobatch box.train
..\training\unicharset_extractor test.001.box test.002.box test.003.box
..\training\mftraining -U unicharset -O test.unicharset test.001.tr test.002.tr test.003.tr
..\training\cntraining test.001.tr test.002.tr test.003.tr
rename normproto test.normproto
rename Microfeat test.Microfeat
rename inttemp test.inttemp
rename pffmtable test.pffmtable
..\training\combine_tessdata test.

在文件较多时可以用程序生成这种脚本执行。

Tesseract-OCR3.01语言库训练步骤

这些天由于工作需要,需要对验证码进行识别,当然验证码识别是老问题了,这里介绍了google开源项目Tesseract-OCR3.01对于验证码的识别。对于这款开源项目,要想彻底搞清楚这款开源OCR软件的来龙去脉,还得看Google开源项目的说明:http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3,这里就不罗嗦了。

我使用的是最新的3.01版本的。训练所需准备:

1.下载并安装3.01版本的tesseract。事实上并不需要安装这步骤,我下载的是压缩包版,解压即可,这里我解压到E:\Tesseract-ocr目录。

2.下载并安装jTessBoxEditor工具,这是一个Box file editors,用来编辑训练文件的,直接下载地址在这里。这个软件是用java写的,运行需要安装jre,好在这个东西比.net好装多了,怎么运行可以见它的readme文件。

3.当然也可以用cowboxer1.01.exe这个工具,他也是Box file编辑工具,在实际应用中,最好将这两个工具结合。

4.接下来要训练一个新的语言(自定义语言或者某种自然语言都可以)对应的traineddata文件,需要产生下列过程文件:

• cnlp.config

• cnlp.unicharset

• cnlp.unicharambigs

• cnlp.inttemp

• cnlp.pffmtable

• cnlp.normproto

• cnlp.punc-dawg

• cnlp.word-dawg

• cnlp.number-dawg

• cnlp.freq-dawg

在这八个文件中,红色标示的是必须的,其他的文件可选。当这些文件都准备好之后,再使用combine_tessdata进行最后的合并工作,生成cnlp.traineddata,这个文件就是最终训练出来语言库。下面再来说一下如何产生上述的文件:

1、获取一个训练图片(*.tif)

这里采用铁道部购票系统中的验证码 [点击图片可在新窗口打开] ,将这个验证码下载后,用上文提到的jTessBoxEditor工具将其转换为tif文件,或者直接重命名也可以。名称为cnlp.lpft.exp0.tif,命名规则可以参照官网说明:

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox。

2、产生相应的Box文件(*.box)

命令:tesseract.exe cnlp.lpft.exp0.tif cnlp.lpft.exp0 batch.nochop makebox

这一步产生对应的cnlp.lpft.exp0.box文件。该文件记录了tesseract识别出来的每一个字和其位置坐标。使用jTessBoxEditor编辑该Box文件,校正识别出来的字符,如果单个字符识别成了两个或者多个字符,则要将这些行进行合并。前两项坐标取最小值,后两项坐标取最大值。

备注:这时候要注意的是编辑box要和tif文件同在一个目录下,然后逐个校正文字,后保存。

如果使用cowboxer1.01,他会自动找到与之相对于的box文件。

3、产生字符特征文件(*.tr)

命令:tesseract cnlp.lpft.exp0.tif cnlp.lpft.exp0 nobatch box.train

这一步产生两个文件:

(1)cnlp.lpft.exp0.txt;

(2)cnlp.lpft.exp0.tr为特征文件。

可能会产生tesseract.log主要是记录该步骤执行结果的日志没啥用;

4、计算字符集(unicharset)

命令:unicharset_extractor cnlp.lpft.exp0.box

这一步产生字符集文件unicharset。

5、聚集字符特征(inttemp、pffmtable、normproto)

命令:mftraining -F font_properties -U unicharset cnlp.lpft.exp0.tr

这一步中的font_properties这个文件需要自己手动创建,文件内容

whereis a string naming the font (no spaces allowed!), and, , , and are all simple 0 or 1 flags indicating whether the font has the named property.

官网有详细说明,大致意思就是你设置的字体。

这是我的font_properties内容:lpft 0 0 1 0 0。

根据上一步产生的字符集文件unicharset,来生成当前新语言的字符集文件mfunicharset。同时还会产生图形原型文件inttemp和每个字符所对应的字符特征数文件pffmtable。附带还会产生Microfeat文件,但是这个文件没啥用。

接下来使用命令cntraining.exe cnlp.lpft.exp0.tr,这一步产生字符形状正常化特征文件normproto。

到这里基本上所需的文件都形成了,下面就开始生成字典文件。

6、合并训练文件(*.traineddata)

此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pffmtable这四个文件加上前缀“cnlp.“。然后使用命令:combine_tessdata cnlp.

将其合并成一个字典文件。这时会生成如下结果:

[点击图片可在新窗口打开]

必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了。

此时目录下“cnlp.traineddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。

以后就可以使用该该字典来识别了。

7、测试

tesseract-ocr训练方法

tesseract-ocr有2和3两个版本,不同版本训练方法稍有不同。

第3版本的训练方法官版教程在这里:TrainingTesseract3

第2版的训练方法官版教程在这里:TrainingTesseract

我使用的是最新的3.01版本的。训练所需准备:

1.下载并安装3.01版本的tesseract。事实上并不需要安装这步骤,我下载的是压缩包版,解压即可,这里我解压到E:\Tesseract-ocr目录。

2.下载并安装jTessBoxEditor 工具,这是一个Box file editors,用来编辑训练文件的,直接下载地址在这里。这个软件是用java写的,运行需要安装jre,好在这个东西比.net好装多了,怎么运行可以见它的readme文件。

3.一张用来训练的tiff格式图片。

在不通过训练的前提下,使用tesseract来识别一个订单号的内容,如图1发现错误率很高,希望通过训练来提高准确率。

训练过程:

1.通过合并10张如上图的图片合并为一张tiff格式的图片,如何合并呢?通过jTessBoxEditor的Merge Tiff 来完成,不过他的小缺点就是只能合并多张tiff格式的,如果你的图片是jpg的,需要先转换。生成后的tiff图片叫做orderNo.tif

2.Make Box Files。在orderNo.tif所在的目录下打开一个命令行,输入:

E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo batch.nochop makebox

来生成一个box文件,该文件记录了tesseract识别出来的每一个字和其位置坐标。

3.使用jTessBoxEditor打开orderNo.tif文件,需要记住的是第2步生成的orderNo.box要和这个orderNo.tif文件同在一个目录下。逐个校正文字,后保存。

4.Run Tesseract for Training。输入命令:

E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo nobatch box.train

5.Compute the Character Set。输入命令:

E:\Tesseract-ocr\unicharset_extractor.exe orderNo.box

6.新建文件“font_properties”。如果是3.01版本,那么需要在目录下新建一个名字为“font_properties”的文件,并且输入文本 :

orderNo 0 0 0 0 0

大致意思就是说orderNo这个语言的字体为普通字体。

并执行命令:

E:\Tesseract-ocr\mftraining.exe -F font_properties -U unicharset orderNo.tr

7.Clustering。输入命令:

E:\Tesseract-ocr\cntraining.exe orderNo.tr

8.此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pffmtable这四个文件加上前缀“orderNo.”。然后输入命令:

E:\Tesseract-ocr\combine_tessdata.exe orderNo.

会显示一个结果如:

Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 108
Offset for type 2 is -1
Offset for type 3 is 1660
Offset for type 4 is 327545
Offset for type 5 is 327781
Offset for type 6 is -1
Offset for type 7 is -1
Offset for type 8 is -1
Offset for type 9 is -1
Offset for type 10 is -1
Offset for type 11 is -1
Offset for type 12 is –1

必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了。

此时目录下“orderNo.traineddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。

以后就可以使用该该字典来识别了,例如:

tesseract.exe test.jpg result –l orderNo

通过训练出来的新语言,识别率提高了不少。

关于tesseract-ocr3的训练和使用

众所周知,这是一个出色的字符识别软件。这个开源项目可以在http://code.google.com/p/tesseract-ocr/downloads/list下载。

在使用时,建议使用3而不要使用2,因为一些原因,2虽然可以直接用在工程,但是由于一些显而易见的BUG和其他原因,多导致程序无法运行甚至崩溃。所以建议使用命令行版本的3 。

除了下载tesseract安装程序以外,还可以在下载页面下载一些语言库,当然,也可以在安装过程中选择一些语言库来进行安装。

一、训练

在很多时候,默认的字库等完全可以高准确度的识别,但是有些时候我们需要训练自己的库来使用。训练步骤如下:

注:

A、均以DOS命令为例,即将每步下面的命令保存为.BAT运行,或运行CMD进入tesseract所在目录运行

B、注意保证文件名的一致性(此处均为DDT)

0、复制training目录下的全部文件到tesseract3所在目录

copy .\training\*.exe .\

1、标记边框

tesseract ddt.tif ddt -l eng digits batch.nochop makebox

解释一下

ddt.tif为要识别的文件,支持jpg,gif,tiff等格式,建议用tif

ddt 为要保存的文件名(自动添加扩展名.box)

-l eng 使用的库,这个参数可以让我们选择用哪个字库来标记边框

后面的都是配置文件了,也就是tesseract的其他参数被以文件形式加载,而不是直接输入参数

digits指定了只识别0-9的数字(当然你可以编辑它,使它包含更多的字符),当你不需要指定时,一定要去掉这个参数,但使用这种字符集限定,可以最大程度上减少被错误识别搞的你编辑ddt.box头昏脑胀的几率。

注:

这一步非常关键,但也经常出现问题,即使你在http://code.google.com/p/bbtesseract/downloads/list下载了bbtesseract也是如此,所以我感觉应该自己编一个边框识别,但没有时间做。完全可以将命令写入到软件里,实现图形化。所以,注意编辑你生成的ddt.box文件,保证字符都被识别且边框正确。

这里也有一个小技巧,例如我做过这样一个tif:1.2-34567089,在这一步的时候,只识别了2-9这一部分,于是我修改tif为:001.2-34567089,就全部识别了。也许可以给你一些启示。

2、形成语言库

tesseract ddt.tif ddt -l eng digits nobatch box.train
unicharset_extractor ddt.box
rename unicharset ddt.unicharset
mftraining -U unicharset -O ddt.unicharset ddt.tr
rename inttemp ddt.inttemp
rename pffmtable ddt.pffmtable
rename Microfeat ddt.Microfeat
cntraining ddt.tr
rename normproto ddt.normproto
combine_tessdata ddt.

这里面包含了若干步骤,但其他人扒的“教程”已经啰嗦很多了,不再啰嗦。

注:那几个rename是必要的,因为生成的文件只有扩展名。只要注意了这些,就没问题了。

3、测试语言库

copy ddt.traineddata .\tessdata\ddt.traineddata

tesseract ddt.tif ddt -l ddt
notepad ddt.txt

如果测试失败了,你应该检查:

A、是否tif宽度太小,如果是,我建议你在下面增加一行,就是说把1行改成2行,增加什么呢,随意增加一些你字库里面的字符,但最好和图像一样宽。

B、如果还没正确识别,回头仔细检查你的ddt.box

如果你失败了,记得清理前面生成的文件,可以使用一下命令:

copy ddt.tif tmp.tif
del ddt.* /f /s
copy tmp.tif ddt.tif
del tmp.tif

然后从第一步重新来过。

二、使用

使用时,只需要注意,对于单行并且字符数较少的图像,如果不识别,最好是在下面添加一行无用行,并保证该行基本达到图像宽。

注:

在使用时,可能会发生找不到字库的情况(尤其当你卸载后重装tesseract时),此时,应修改

HKEY_CURRENT_USER\Environment\TESSDATA_PREFIX的值为你的tesseract所在目录。

三、示例

最后给出一个tesseract3在VB.NET下使用的示例代码。

代码
复制代码
Public Class TessOCR

Dim path As String = My.Application.Info.DirectoryPath & “\tesseract3\”

Sub New()
My.Computer.Registry.CurrentUser.OpenSubKey(“Environment”, True).SetValue(“TESSDATA_PREFIX”, path)
End Sub

Public Function Tess3OCR(ByVal Rect As Rectangle, ByVal clr As Integer) As String
‘建立图像,注意屏幕复制时使用SourceCopy以符合OCR要求的图像格式,否则出错或直接关闭
Dim bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height * 2)
Dim gr As Graphics = Graphics.FromImage(bmp)
gr.Clear(Color.White)
gr.CopyFromScreen(Rect.Location, Point.Empty, Rect.Size, CopyPixelOperation.SourceCopy)
‘校正为白纸黑字
For y As Integer = 0 To bmp.Height – 1
For x As Integer = 0 To bmp.Width – 1
If bmp.GetPixel(x, y).ToArgb = clr Then bmp.SetPixel(x, y, Color.Black) Else bmp.SetPixel(x, y, Color.White)
Next
Next
Dim str As String = IIf(clr = AngleColor, “45.000000”, “0.000000”)
gr.DrawString(str, New Font(“Arial Black”, 14), Brushes.Black, 0, Rect.Height)

bmp.Save(path & “tmp.tif”, System.Drawing.Imaging.ImageFormat.Tiff)
Shell(path & “tesseract ” & path & “tmp.tif ” & path & “tmp -l ddt digits”, AppWinStyle.Hide, True)
My.Computer.FileSystem.DeleteFile(path & “tmp.tif”)
Dim ret As String = My.Computer.FileSystem.ReadAllText(path & “tmp.txt”).Split(vbCrLf)(0)
My.Computer.FileSystem.DeleteFile(path & “tmp.txt”)
Return ret
End Function
End Class

复制代码

在代码的new函数中,我修改了注册表,以防止出错,更好的做法应该是在这之前记录原始值并在类销毁时恢复。之后,指出了屏幕复制时可能存在的一些问题,当然,如果你是取验证码啥的,那就不用关心这些了。然后对图像进行了简单的校正,需要注意的是,必须校正为白底黑字才行,否则不识别。而后,我在下面添加了一行无用的文字,并在返回值时进行了适当处理。再有一点需要注意的是,shell函数的最后一个参数,指出了等待调用进程结束,如果你要在vb6当中使用,这里就需要用api来实现等待——而不要用sleep等定时等待函数,那将会使得你的程序不够健壮。

瑞芯微RK3066

台电P85平板电脑使用了 瑞芯微RK3066,下面是它的参数:

  峰值主频:1.6GHz
  内核构架:Cortex A9
  指令集:ARMv7
  核心数目:双核
  制程工艺:40纳米
  二级缓存:512K
  GPU型号:Mail400 四核
  GPU主频:300MHz