信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 2612|回复: 2
打印 上一主题 下一主题

[『 Java 图文教程』] 深入Java对象及元素的存储区域和实例教程

  [复制链接]

678

主题

762

帖子

4916

积分

积分
4916
跳转到指定楼层
宣传软件楼主
发表于 2016-10-18 12:34:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:Java 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件高级教程 

软件教程发布日期:2016-10-18

软件教程关键字:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述

在JAVA平台上开发应用程序的时候,有一个很大的特点就是其是在应用程序运行的时候才建立对象。换句话说,在程序运行的时候,才会最终确定对象的归属,即对象应该存储在什么地方。由于存储在不同的区域,其在性能上会有所不同。为此作为Java程序开发人员需要了解各个存储区域的特点以及对性能的影响。然后再根据需要来调整应用程序的区域分配。总的来说,在操作系统中有五个地方可以用来保存应用程序运行中的数据。这类区域的特点以及对性能的影响分析如下。

    存储区域一:寄存器

    虽然同在内存中,但是不同的区域由于用途不同,其性能也有所不同。如就拿Java应用程序来说,寄存器由于其处于处理器的内部,为此这个区域存取数据最快。跟内存中的其他存储区域有着天壤之别。那么我们把所有对象都放到这个区域内,不就可以提高Java应用程序的性能了吗?理论上是如此,但是在现实中是行不通的。因为这个寄存器的数量是非常有限的。在内存中的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。所以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。

    存储区域二:堆栈

    对象的创建有两种方式,一是在应用程序开发的过程中就创建对象;二是在程序运行的过程中要用到对象的时候再来创建对象。前者比后者性能要高,而后者比前者要灵活。这主要是因为前者创建对象的时候,就是这个堆栈中创建的。虽然其创建的对象没有保存在寄存器中,但是通过这个对象的推栈指针可以直接从处理器哪里获得相关的支持。如堆栈指针往上移动的时候,则释放原有对象占用的内存;如堆栈指针向下移动时,则为对象分配新的内存。所以,如果把对象存放在这个堆栈中,虽然性能没有像存放在寄存器中那么理想,但是仍然比存储在其他地方要好的多。

    由于Java程序是在程序运行过程中才根据需要来创建对象。为此对象就不能够保存在这个堆栈中。不过Java应用程序也不能够白白的浪费这个宝贵的空间。为此虽然Java对象本身没有保存在这个堆栈中(不是不保存而是这里没有他的容身之地),但是还是应该把一些可以放的内容放到这个堆栈中,以提高应用程序的性能。如可以把一些对象引用存放在这个堆栈中。

    另外对于一些基本的数据类型对象,Java程序也往往把他们放置在堆栈中,以提高数据处理的性能。如一些整数型、字符型的数据对象,这些对象有些共同的特点,如对象比较小、是Java程序提供的标准对象等等。对于这些对象由于每个应用程序基本上都需要用到,而且我们程序开发人员只能够引用这些对象,而不能够对其进行更改。为此Java程序在处理的时候,往往一开始就创建了对象(即直接在堆栈中创建对象并保存),而不像其他对象一样,在需要的时候才创建。只所以在堆栈中创建这些对象,还有一个重要的原因。因为如果在堆栈中创建对象的话,Java编辑器必须知道存储在堆栈内所有数据的确切大小和生命周期。为了得到这些信息,必须产生相关的代码来获得这些信息,以便其操作堆栈指针。普通的对象大小、生命周期等等难以预先获得,为此在堆栈中创建普通的对象,对于Java应用程序来说并不是很合适。相反,这些Java编译器预定义的对象大小并不会随着机器硬件架构的变化和用户需求的变化而变化;而且这些对象往往从始之终都会存在的,所以也不存在生命周期的问题。所以把这些对象放置在堆栈中是合理的,也是可实现的。如此处理,不仅不会影响到对象的灵活性,而且还可以提供比较好的性能。

    存储区域三:堆

    堆虽然跟堆栈一样,都是随机访问存储器中的区域,但是两者有很大的不同。因为在堆中,没有堆栈指针,为此也就无法直接从处理器那边获得支持。为此其性能跟堆栈比起来,就有一定的差距。通常情况下,除上面所说的一些预定义对象之外,其他的对象都是保存在这个堆中的。或者说,利用new关键字创建的对象都是保存在堆中的。保存在堆中其好处也是显而易见的。如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。所以在堆里分配存储有很大的灵活性。当需要对象时,我们可以使用New关键字建立一个对象。然后系统会自动给这个对象在堆中分配一个区域让其作为归宿。不过其最大的不足之处,就是在堆中创建对象与分配存储区域,要比在堆栈中慢许多。鱼与熊掌不能兼得呀。

    存储区域四:静态存储区域与常量存储区域

    在Java对象中有一些特殊的元素。如有些元素是比较特别的(如利用关键字Static定义的变量)。这些变量对于其他对象来说,可能就是静态的。为了更好的管理这些变量,Java在内存中专门划分了一个静态存储区域来管理这些元素。这里的静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据。这里需要明确的一点就是,Java对象是不保存在这个地方的,而只是把对象中的一些特殊元素放置这里。由于位置固定,所以下次调用的时候就省去了查找的麻烦。为此其对于提供应用程序的性能是有利的。作为我们程序开发人员来说,在书写代码的时候,就需要灵活应用Static这个关键字。笔者的意见是,能用则用;不能用的时候也要想着法儿用。特别是有些元素用不用Static关键字时对于程序功能没有影响,此时我们要理直气壮的在元素前面加上Static关键字。

    在Java对象中还有一类特殊的元素,我们叫做常量。由于常量的值是稳定不变的,如圆周率。为此把他们放在代码的内部是可行的。不过有些时候,在进行一些嵌入式系统开发的时候,我们往往不这么做。而是会把常量元素跟代码分开来保存。如我们会根据情况把常量的值存放在一些只读存储器中。这主要是为了一些特殊的功能考虑的。如出于版权控制的需要。如在打印机上为了保护原装耗材的版权,往往把常量跟代码分开存放。

    存储区域五:非RAM存储

    有时候,有些程序运行所需要的数据我们还会放置在其他地方。如在一些系统中需要用到流对象,这个对象的数据并没有保存在上面所谈到的任何一个存储区域,这个对象直接被转为为字节流,发送到其他的主机上去了。另外有一种叫做持久化的对象,其是被存储在硬盘中的。这些对象平时在应用程序开发过程中用到的并不是很多,大家只需要了解有这些对象的存在即可。等到需要用到的时候,再去深入研究也不迟。

    从上面的分析中我们可以看到,对象的归属我们程序开发人员很难控制。寄存器是编译器来管理的。而堆与堆栈又基本上受到开发平台的限制,我们程序人员也没有这个能耐来干涉他们。其实我们主要能够调整与控制的就是第四个存储区域,即静态存储与常量存储。笔者的建议是,对于非嵌入式程序,能够利用静态存储来实现的,就尽量采用静态存储。而对于常量来说,需要根据需要实现的功能来判断是否需要把常量存储在只读存储器中。有时候对于版权的保护等等需要用到这个只读存储器。



untoJAVA中浅复制与深复制和多方法实例教程next立贴为证猫宁电商看看一起能走过多远立于不败之地
回复

使用道具 举报

678

主题

762

帖子

4916

积分

积分
4916
信息发布软件沙发
 楼主| 发表于 2016-10-18 12:35:43 | 只看该作者

我们经常看到这个句话:

Java里存放的容器只能是1个对象.



一. 值类型和对象类型.

实际上, java里的变量可以分为两种类型, 一种是值类型. 一种是对象类型.



1.1 值类型变量

所谓值类型的变量就是内容(值)直接保存在stack(栈区)或静态区的变量.


例如


[java] view plain copy


  • int i = 10;   




这个i就是值类型变量.   这个变量的内容(值)存放在内存的栈区.

深入Java对象及元素的存储区域和实例教程 b2b软件


如上图, 红色部分就是值类型变量i所占的内存, 共4个字节.


在java中, 一共有八种值类型. 它们分别是

byte, short, int, long, float, double, char, boolean

可以见这些值类型变量的值要么是数字, 要么就是字符(char)

也就是说, 这8中类型之类的变量都是对象类型.




1.2 对象类型变量所谓对象类型变量的内容存(成员的值)放在heap(堆区)(String对象除外), 然后在stack区或static区保存这个对象内容heap区内存的地址.

假如Student是1个类, 它有两个成员id 和 age.

那么实例化1个对象


[java] view plain copy


  • Student s = new Student(1,20);  


上面的s就是1个对象类型的变量.

它的数据是这样存放在内存中的.

1.它成员Id 和 name 的值会存放在heap区.

2.变量s本身会存放1个地址, 这个地址就是它的成员在heap区内存的头部地址.  


如下图:

紫色的部分才是对象型变量s的真正内容,

而变量s本身存放的是其真正内容在heap区内存的地址.

深入Java对象及元素的存储区域和实例教程 b2b软件





二. 为什么java容器只存放对象类型.

2.1 c语言数组只能存放单种元素


我们知道, Java是c/c++ 发展而来的.

我们回忆一下C语言对于数组的特性.

1. 数组在连续的一块内存空间内存储

2. 数组内的元素必须是相同类型的.


例如 int[] 数组只存放int 类型元素,  char[] 数组只存放char类型元素.

为什么呢.


原因很简单, 因为在c语言数组连续的内存中,

如果要判断数组内的其中1个地址内存是属于第几个元素的,

则:

1. 知道数组第1块内存的地址.

2. 计算当前地址与第1块内存地址的距离

3. 知道每1个元素所占的内存长度.

4.利用内存除以单个元素内存长度则可以求出当前内存属于第几个元素.


也就是说, 数组内的每个元素所占的内存必须是一样的.  这样才可以求出数组的某个地方属于第几个元素.



2.2 Java的数组可以存放多种属于不同类的对象

而Java里的数组为何能存放多种种类的元素呢?

例如下面代码是合法的:


[java] view plain copy


  • ArrayLIst Arr = new ArrayList(0;  
  • Arr.add(new Student(1,20);  
  • Arr.add(new School(1,"No.5 school","address");  
  • Arr.add(new City(1,"Canton","Guangdong","China");  


上面代码在1个数组容器内添加了3个对象.

这3个对象分别属于Student, School 和City类,  这3个对象明显不是属于同1个类,而且所占的内存大小很明显是不同的.

但是能存放在同1个数组容器中.


原因就是

上面三个对象的内容(成员的值)所占的内存是不同的,  这些内存都存放在Heap区内.

但是, 数组容器并不是直接存放上面3个对象的内容, 而只是保存这3个对象内容在Heap区的头部地址.


而无论这个三个对象所占的heap区内存相差多大, 它们的头部地址所占的长度都是一样的4byte(32位系统)

所以实际上数组内的元素都是同1种类型, 就是内存地址类型, 它们的长度都一样啊.

如下图:

深入Java对象及元素的存储区域和实例教程 b2b软件



上图3块红色内存就是连续的, 它们都属于存放在数组Arr内.


所以我们讲: Java里的容器只存放对象类型元素, 但是实际上是存放对象内容的头部地址.



三. 自动装箱(boxing) 和 自动拆箱(unboxing)

但是实际上, 我们往往在容器里直接添加值类型变量.

例如下面的代码是合法的:


[java] view plain copy


  • ArrayList arr = new ArrayList();  
  • arr.add(123);  
  • arr.add("Jack");  
  • int i;  
  • String s;  
  • i = arr.get(i);  
  • s = arr.get(2);  
  • System.out.printf("%d, %s\n",i,s);  


上面我们直接往1个ArrayList容器添加了值类型对象123 和 "Jack"? 不是跟上面所说的矛盾吗?



3.1 "Jack" 是1个字符串对象类型, 而不是值类型.

本文在上面提过, java只有8中值类型.

而"Jack" 是1个字符串常量,  它的内容保存在static区,  它是1个对象而不是值类型.

其实对象类型和值类型的最大区别就是, 对象类型具有成员.

可以通过 ".属性名" 或 ".方法名()"来调用对象的属性or方法.

下面的代码就是合法的, 它输出了1个字符串常量对象的长度:


[java] view plain copy


  • System.out.printf("%d\n","Jack".length());  






3.2 什么是装箱(boxing)

虽然我们执行了代码

arr.add(123);

但是如果数组内直接存放数值123的值就违反了java容器只存放对象的原则了.


实际上, java里, 对于值类型来讲, 都有1个对应的对象类型.

例如 int是1个整形值类型,  而Interger是1个整形类


Interger里有1个成员属性, 用于存放1个整形值类型的值.

还包含很多对整形值操作的方法.


而int 整形类型本身是没有任何成员方法的.

所以有时我们会用1个Integer对象将1个int变量包起来.

例如


[java] view plain copy


  • int i = 123;  
  • Integer io =  new Integer(int i);  
  • System.out.printf("%d\n", io.intValue());  


上面的i就是1个整形值类型变量

而io就是1个Integer对象.

这个过程就叫做装箱.


对于容器来讲,

如果将1个值类型直接放入容器, java会将其装箱后再放入容器.

这个过程就叫做自动装箱.

所以下面两句代码是等价的.


[java] view plain copy


  • arr.add(123);  
  • arr.add(new Integer(123));  


所以实际上并没有违反java容器只存放对象的原则.



3.3 什么是拆箱

这个也很简单, 就是基于1个对象类型返回1个值类型就是拆箱了.

例如:


[java] view plain copy


  • integer io = new Integer(123);  
  • int i = io.intValue()'  
  • System.out.printf("%d\n", i);  


上面代码中我们用值类型变量i 获得 Integer对象io所存放的值, 这个过程就是拆箱


如果我们利用容器的get()方法来返回1个值类型.

例如:


[java] view plain copy


  • int i = arr.get(1);  


我们知道容器里存放的都是对象, 但是java会先将其拆箱再返回给1个值类型变量,

这个过程那个就是自动拆箱了.







回复 支持 反对

使用道具 举报

678

主题

762

帖子

4916

积分

积分
4916
推广工具板凳
 楼主| 发表于 2016-10-18 12:41:59 | 只看该作者
Java对象内存结构
鉴于我之前学习C/C++,Java中有一件事始终困扰着我,就是Java中缺少一个计算对象占用内存大小的方法。C++提供了sizeof运算符让你能计算基本类型和一个给定类型的对象占用内存的大小。这个操作符在C和C++中对于像指针运算,内存拷贝和IO这类操作都非常有用。

Java没有类似的操作符。实际上,Java并不需要这样的操作符。在Java中基本类型的大小是语言描述的,而在C和C++中是与平台相关的。Java有它自己的一套为序列化而设计的IO体系结构。而且Java没有指针运算和大内存拷贝,因为Java就没有指针这个概念。

即便如此,Java开发人员有时候还是好奇一个Java对象到底占用了多大的内存。事实证明,答案并不那么简单。

首先需要弄清楚的是“浅大小”和“深大小”的区别。一个对象的“浅大小”是指这个对象本身所占用内存空间的大小,并不考虑它所关联对象的大小。另一方面,“深大小”不仅考虑了这个对象的“浅大小”还把这个对象所有引用的对象的大小迭代的计算在内。大部分情况下,你都希望知道一个对象的“深大小”,但是为了知道它,你得首先先学会怎么计算“浅大小”,这正是我在这儿要讨论的。

现在有一个复杂的情况就是Java对象在运行时的内存结构并没有在虚拟机中被严格的规范,这也就意味着不同的虚拟机提供者可以根据他们自己的意愿去实现虚拟机。这样造成的后果就是你定义的同一个类型的实例在不同的虚拟机中会占用不同的内存空间。然而普遍的,包括我自己在内,使用的都是Sun HtoSpot虚拟机,这使得事情变得简单。剩余部分的讨论都是针对32位的Sun JVM。我将列出几个规则来说明Java虚拟机在内存中怎么组织对象的布局。

没有实例属性的类的内存布局

在Sun JVM中,所有的对象(除了数组)都有两个字的头部,第一个字包含对象的标识,哈希码以及一些标志信息,比如锁的状态,年龄(注:经过了几次gc)。第二个字是指向该对象类型的应用。另外任何对象都对齐到一个8字节的粒度。这也就是第一个规则或者说对象内存布局:

规则一:所有的对象都对齐到一个8字节的粒度。

现在我知道了如果调用new Object(),我们只需要将堆里面的8个字节分配给对象的头部,因为Object类没有任何的属性。

继承Object的类的内存布局

在8个字节的头部之后紧接着是类的属性。属性总是根据它们自己类型的大小进行对齐。举个例子,int被对齐到一个4字节的粒度,long被对齐到一个8字节的粒度。这样做是出于效率的原因:通常如果字被对齐到一个4字节的粒度,那么从内存中读取一个4字节的字到处理器的寄存器中将会很高效。

为了节省一些内存,Sun JVM没有按照属性在类中声明的顺序进行布局,而是按照下面的顺序在内存中进行组织的:
  • doubles and longs
  • ints and floats
  • shorts and chars
  • booleans and bytes
  • references

这个策略能很好的优化内存的使用。例如,假设你定义了下面的一个类:
class MyClass {    byte a;    int c;    boolean d;    long e;    Object f;        }

如果Java虚拟机没有调整属性的顺序,对象的内存布局会是如下所示:
[HEADER:  8 bytes]  8[a:       1 byte ]  9[padding: 3 bytes] 12[c:       4 bytes] 16[d:       1 byte ] 17[padding: 7 bytes] 24[e:       8 bytes] 32[f:       4 bytes] 36[padding: 4 bytes] 40

注意到,因为需要对其,14个字节的空间被浪费了,这个对象将使用40个字节的内存空间。如果安装上面的规则重新调整属性的顺序,对象的内存布局就会变成:
[HEADER:  8 bytes]  8[e:       8 bytes] 16[c:       4 bytes] 20[a:       1 byte ] 21[d:       1 byte ] 22[padding: 2 bytes] 24[f:       4 bytes] 28[padding: 4 bytes] 32

这个时候仅仅只需要6个字节用来填充,而且对象总共只需要32个字节的内存空间。

这就是对象内存布局的规则二

规则二:类的属性按照这样的数序进行排序:首先是long和double,然后int和float,然后char和short,然后byte和boolean,最后是引用。每个属性都按照它们自己的粒度进行对其。

现在我们知道了怎么计算一个直接继承自Object的类的对象占用内存的大小。一个实际的例子是java.lang.Boolean类。下面是它的内存布局:
[HEADER:  8 bytes]  8 [value:   1 byte ]  9[padding: 7 bytes] 16

一个Boolean类的实例占用了16个字节的内存!是不是很惊讶?(注意最后填充的字节是为了对齐8字节粒度)

其他类的子类的内存布局

接下来对于那些继承了父类的类java虚拟机有三个规则来组织其内存结构。对象内存布局的规则三如下:

规则三:属于不同类层次的字段永远不要混合在一起。父类的字段放在第一位,遵守规则二,其次是子类的字段。

举例如下:
class A {   long a;   int b;   int c;}class B extends A {   long d;}

B的一个实例在内存中的布局如下:
[HEADER:  8 bytes]  8[a:       8 bytes] 16[b:       4 bytes] 20[c:       4 bytes] 24[d:       8 bytes] 32

如果父类的字段不满足4字节的粒度,下面的规则将被使用。内容如下:

规则四:在父类的最后一个字段和子类的第一个字段之间必须填充对齐到4字节边界。

举例如下:
class A {   byte a;}class B {   byte b;}[HEADER:  8 bytes]  8[a:       1 byte ]  9[padding: 3 bytes] 12[b:       1 byte ] 13[padding: 3 bytes] 16

注意字段a后面的3个字节的填充是为了对齐到4字节的粒度。填充的空间会丢失而且不能被B类的字段所使用。

如果子类的第一个字段是long或者double并且父类没有对齐到8字节的边界,最后的这个规则将被使用来节省空间。

规则五:如果子类的第一个字段是long或者double并且父类没有对齐到8字节的边界,Java虚拟机将打破规则二并且尝试按照:首先int,然后short,然后byte,最后引用的顺序将字段放到子类内存空间开始的地方,直到填充整个空白。

举例如下:
class A {  byte a;}class B {  long b;  short c;    byte d;}

内存布局如下:
[HEADER:  8 bytes]  8[a:       1 byte ]  9[padding: 3 bytes] 12[c:       2 bytes] 14[d:       1 byte ] 15[padding: 1 byte ] 16[b:       8 bytes] 24

在第12个字节处,A类结束,Java虚拟机打破规则二将一个short和一个byte放在了long的前面,从而节省了可能会浪费的三四个字节。


数组的内存布局


与普通对象不同,数组有一个额外的头部,该头部用来储存数组的长度。接着是数组的元素,数组作为一个对象,同样也需要对齐到一个8字节的粒度。

下面是包含3个元素的字节数组的内存布局:
[HEADER:  12 bytes] 12[[0]:      1 byte ] 13[[1]:      1 byte ] 14[[2]:      1 byte ] 15[padding:  1 byte ] 16

下面是包含3个元素的长整型数组的内存布局:
[HEADER:  12 bytes] 12[padding:  4 bytes] 16[[0]:      8 bytes] 24[[1]:      8 bytes] 32[[2]:      8 bytes] 40

内部类的内存布局

非静态内部类有一个额外的“隐藏”字段用来保存指向外部类的引用。这个字段是一个普通的引用,它遵从引用类型的内存布局的规则。所以,内部类会有额外的4个字节的代价。


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件AIWROK苹果IOS线条类[Line]复杂示例
AIWROK苹果IOS线条类[Line]复杂示例
信息发布软件AIWROK软件苹果IOS线条实作简单示例
AIWROK软件苹果IOS线条实作简单示例
信息发布软件AIWROK软件IOS苹果线条类[Line]方法小结
AIWROK软件IOS苹果线条类[Line]方法小结 . 线条宽度设置方法2. 线条高度设置方法3. 线条颜色设置方法实用演示例子:
信息发布软件AIWROK软件苹果IOS吐司toast.show方法小结
AIWROK软件苹果IOS吐司toast.show方法小结 实例呈现:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:OCR 识别(指定区域)方法 2:获取图像 Base64 编码方法 3:获取 Mat 对象方法 4:Mat 转 Image方法 5:Base64 转 Image方法 6:读取图片文件为 Image方法 7:释放图像资源实战示例子:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:cv 文件找图(模版匹配 cv 找图)方法 2:cv 文件 OCR(模版匹配 OCR)方法 3:模版匹配(通过模版匹配找到目标对象)方法 4:找多图方法 5:转灰度图(图像转灰度图)方法 6:裁切图片(从大图中截图裁切图片)方法 7:二值化方法 8:颜色翻转实战实例:
信息发布软件AIWROK软件苹果IOS系统随机数[RJrxn1afZqW7yjf2NK]方法小结
AIWROK软件随机数[RJrxn1afZqW7yjf2NK]方法小结 📌GQGqcAlZv2随机字符📌WBJqf91s7J随机整数📌LtUqFOGkc6随机小数📌随机布尔值生成函数📌随机数组元素选择函数使用示例表 📌随机日期使用示例表使用示例表使用示例表📌随机UUID生成函数函数说明表使用示例表📌随机密码 / 验证码随机密码 / 验证码生成函数及使用说明[/backcolor]函数说明表[/backcolor]使用示例表[/back
信息发布软件AIWROK软件苹果系统里的事件[event]方法小结
AIWROK软件苹果系统里的事件[event]方法小结 方法 1:截屏开始方法 2:截屏暂停方法 3:截屏恢复实战示例:
信息发布软件AWIROK苹果系统屏幕类[screen]方法小结
AWIROK苹果系统屏幕类[screen]方法小结 方法 1:lockScreen(锁定屏幕缓存)方法 2:unLockScreen(解锁锁屏幕缓存)方法 3:isOpenShortcut(是否开启快照截屏)方法 4:getScreenWidth(获取屏幕宽度)方法 5:getScreenHeight(获取屏幕高度)方法 6:ocr(识别支持设定区域)方法 7:screenShot(截图缩放,记得调用 close 释放图像)方法 8:screenShotFull(全尺寸截图,记得调用 close 释放图像)实战实例子:单独 OCR
信息发布软件AIWROK软无任何苹果IOS系统配置[config]方法小结
AIWROK软无任何苹果IOS系统配置[config]方法小结 getConfig 获取配置📌setConfig设置配置实际示例:
信息发布软件AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合
AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合 clear 清理日志📌close关闭日志窗口📌setAlpha设置透明度📌setClickModel设置可点模式,就是无法穿透桌面📌setColor设置日志字体颜色📌setDrag设置为手动拖拽模式setHeight设置高度📌setNoClickModel设置为不可点,穿透桌面📌setPosition设置位置📌setSize设置日志字体大小setTitle设置标题📌setWidth 设置
信息发布软件AIWROK安卓类日志类[print]方法小结总汇集合
AIWROK安卓类日志类方法小结总汇集合 print.log:输出调试 / 日志信息2. print.err:输出错误信息3. print.time:启动计时4. print.timeEnd:结束计时并返回时长5. print.warn:输出警告信息完整的示例:
信息发布软件AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结
AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结 openApp启动app📌appopenUrl打开网址或者Scheme📌openSelf自启动📌screenShot代理截屏📌getTopApp 获取顶端app(I0S18+)特别示例:
信息发布软件AIWROK系统安卓找字OCR___方法小结总汇集合
AIWROK系统安卓找字OCR___方法小结总汇集合 findIncludeText查询包含文字🔍🔢findIncludeTexts查询包含文字多目标🔍🔢findSimilarText模糊查询🔍🔢findText查询文字🔍🔢getAllDetect 获取所有目标🔍🔢getAllString 获取所有字符串🔍🔢getJson 获取json对象🔍🔢getJsonString 获取json字符串🔍🔢MLKitOcr文字
信息发布软件AIWROK软件toast_显示方法小结
AIWROK软件toast_显示方法小结 toast.setAlpha___设置透明度toast.setPoint___设置位置toast.setSize___设置字号toast.setTextColor___设置文字颜色toast.showLong___显示长吐司toast.show___显示吐司特别案例:示例二:示例三倒计时到指定时间并显示剩余时间(红色文字):
信息发布软件AIWROK软件苹果系统方法快捷指令[shortcut]方法小结
AIWROK软件苹果系统方法快捷指令[shortcut]方法小结 openApp启动app(需要前台运行)📌openUrl打开网页(需要前台运行)📌runShortcut打开快捷指令(需要前台运行)
信息发布软件AIWROK软件苹果IOS矩形类[rect]方法小结
AIWROK软件苹果IOS矩形类[rect]方法小结 getLeft 获取左边界📌getRight获取右边界📌getTop获取上边界📌getBottom 获取下边界📌getWidth 获取宽度📌getHeight 获取高度📌getCenterX 获取中心X坐标📌getCenterY 获取中心Y坐标📌inRect 判断点是否在矩形内📌set设置矩形的边界📌toString输出字符串📌getRandX生成随机X坐标📌getRandY生成随
信息发布软件AIWROK软件IOS系统里脚本项目[project]方法小结
AIWROK软件IOS系统里脚本项目方法小结 📌getCodePath 获取代码完整目录📌getPluginsPath 获取插件完整目录📌getResourcesPath 获取资源完整目录📌getCard 获取卡密📌getVersion 获取脚本版本调用示例代码:
信息发布软件IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结
IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结 copyToClipboard 复制到剪贴板📌copyToClipboardPIP复制到剪贴板📌readFromClipboard 从剪贴板读取示例方法实用:
信息发布软件AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结
AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结 📌score 获取检测分数📌getRect 获取检测区域📌clickRandom随机点击📌click点击示例演示:
信息发布软件AIWROK苹果IOS系统里的打印[print]方法小结
AIWROK苹果IOS系统里的打印方法小结 📌now返回本次脚本运行所有日志📌last 返回上次脚本运行所有日志📌showPip 显示画中画,必须前台📌hidePip 隐藏画中画,必须前台log日志📌log日志📌warn警告err 错误📌debug 调试简写printl示例方法演示:
信息发布软件AIWROK软件超多功能越全HID小结方法大放送
AIWROK软件超多功能越全HID小结方法大放送 ⌨️📌back:back 键⌨️📌backspace 键盘back删除键⌨️📌click:点击坐标⌨️📌clickPercent:点击百分比坐标⌨️📌clicks:连续点击⌨️📌clicksV2:连续点击 v2(可设置按下时长)⌨️📌connetBLE:连接蓝牙 HID(必须先完成配对)⌨
信息发布软件AIWROK软件苹果找图YoloV5目标检测[YoloV5]方法小结
AIWROK软件苹果找图YoloV5目标检测[YoloV5]方法小结 📌detectPercent预测📌loadModel 加载模型📌close释放模型
信息发布软件📱⌨️最全的AIWROK软件安卓 HID方法集合小结A
信息发布软件示例苹果IOS系统简单展示一下H5界面AIWORK WebView 示例
示例苹果IOS系统简单展示一下H5界面AIWORK WebView 示例
信息发布软件用AIWROK软件IOS苹果系统创建一个黄色主题风格的 WebView 示例H5
用AIWROK软件IOS苹果系统创建一个黄色主题风格的 WebView 示例H5printl('//🍎交流QQ群711841924');// 创建一个黄色主题风格的 WebView 示例function createYellowThemedWebViewExample() { // 创建 WebView 实例 var web = new WebView(); // 显示界面 web.show(); // 加载黄色主题风格的 HTML 内容 web.loadHtml(`<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UT
信息发布软件苹果创建一个蓝色主题风格的 WebView 示例H5
苹果创建一个蓝色主题风格的 WebView 示例H5 演示了如何创建和操作 WebView 控件。代码中使用了注释的方式避免了实际的 URL 加载和界面关闭,以确保安全性和功能性。以下是代码的详细说明: function createYellowThemedWebViewExample() {...}:定义了一个名为 createYellowThemedWebViewExample 的函数,用于创建一个带有黄色主题风格的 WebView 示例。var web = new WebView();:创建了一个新的 WebView 实例。web.show()
信息发布软件AIWROK软件苹果IOS控件[WebView]方法小结
AIWROK软件苹果IOS控件[WebView]方法小结 📌show显示界面📌loadFile 加载本地文件📌loadHtml 加载 HTML内容📌dismiss关闭界面📌loadUrl加载网页URL完整演示例子:
信息发布软件AIWROK苹果部分功能UI-水平容器[Horizontal]方法小结
AIWROK苹果部分功能UI-水平容器[Horizontal]方法小结 📌addView添加子控件📌removeView移除视图📌clearAllViews清空所有视图📌getViewCount 获取视图数量📌setSpacing设置控件间距📌setBackgroundColor设置背景颜色📌setAlignment 设置对齐方式示例子 1 风格:示例风格 2:
信息发布软件AIWROK软件苹果IOS里的UI-输入框类[Input]方法小结
AIWROK软件苹果IOS里的UI-输入框类方法小结 📌setText 设置输入框文本📌getText 获取输入框文本 📌setlD设置控件ID📌setDefultText 设置默认值📌setTextColor设置文本颜色📌setFontSize设置字体大小📌setBackgroundColor 设置背景颜色📌setWidth设置输入框宽度📌setHeight 设置输入框高度📌setPlaceholder 设置占位符文本📌setTextAlignment 设
信息发布软件AIWROK软件苹果IOS系统Ul-空白站位[Space]方法小结
AIWROK软件苹果IOS系统Ul-空白站位[Space]方法小结 📌setHeight设置高度📌setWidth设置宽度📌setBackgroundColor 设置背景颜色完整示例:
信息发布软件AIWROK软件苹果IOS系统里UI-界面视图[IOSView]方法小结
苹果IOS系统里UI-界面视图方法小结 📌show显示界面📌dismiss关闭📌UIaddView添加📌getView获取view视图📌setBackgroundColor 设置背景颜色完整示例:
信息发布软件&#128296;UI-复选框类[CheckBox]方法小结
🔨UI-复选框类[CheckBox]方法小结📌setText 设置复选框标题📌getText 获取复选框标题📌setID设置控件ID📌setDefultSelect 设置默认值📌select选中复选框📌deselect取消选中复选框📌isSelect获取选中状态📌setColor设置复选框颜色 📌setWidth 设置控件宽度📌setHeight 设置控件高度📌onClick 按钮点击事件示例完整例子:
信息发布软件AIWROK软件IOS系统里的UI-标签类[Label]方法小结
AIWROK软件IOS系统里的UI-标签类[Label]方法小结 📌setText设置标签文本📌setTextColor 设置文本颜色📌setBackgroundColor设置背景颜色📌setFontSize设置字体大小📌setWidth 设置标签宽度📌setHeight设置标签高度📌setTextAlignment设置文本对齐方式完整示例方法例子:
信息发布软件AIWROK软件IOS苹果Ul-垂直容器[Vertical]方法小结
AIWROK软件IOS苹果Ul-垂直容器[Vertical]方法小结//方法小结,交流QQ群711841924//第一个方法:addView添加子控件var label = new Label();label.setText("Hello World");//第二个方法:removeView移除视图var v = new Vertical();v.removeView(0); // 移除第一个子控件//第三个方法:clearAllViews清空所有视图var v = new Vertical();v.clearAllViews(); // 清空所有控件//第四个方法:getViewCount 获取视图数量var v = new Ver
信息发布软件&#128296;AIWROK软件苹果系统UI-按钮[ Button]方法小结
🔨AIWROK软件苹果系统UI-按钮[ Button]方法小结//UI-按钮[ Button]方法小结,交流QQ群711841924// 方法一:setText 设置按钮标题var btn = new Button();btn.setText("点击我");// 方法二:getText 获取按钮标题var btn = new Button();string title = btn.getText();// 方法三:setColor设置按钮颜色var btn = new Button();btn.setColor(50, 100, 150); // 设置按钮颜色为RGB(50, 100, 150)// 方法四:setTextColor 设置
信息发布软件txt文件读写[txt]方法和UI-TAB界面视图[TabView]小结
txt文件读写[txt]方法和UI-TAB界面视图[TabView]小结//UI-TAB界面视图[TabView]方法小结,交流QQ群711841924 // 方法一:show显示界面 //申请一个UI var tab = new TabView(); tab.setTitels(['首页','关于']) vc.show(() => { //页面加载完后执行以下代码 printl("hello IOS") //创建一个水平容器 var h = new Horizontal() //创建一个按钮 var btn = new Butt
信息发布软件TomatoOCR文字识别[tomatoOCR]方法小结[OCR]
TomatoOCR文字识别[tomatoOCR]方法小结[OCR]
信息发布软件苹果系统OCR文字识别和OkHttp 网络请求管理
苹果系统OCR文字识别和OkHttp 网络请求管理
信息发布软件iosApp管理小结和苹果Ocr识别结果小结
iosApp管理小结和苹果Ocr识别结果小结
信息发布软件苹果IOS系统专用AIWROK软件HID键鼠模块小结
苹果IOS系统专用AIWROK软件HID键鼠模块小结
信息发布软件AIWROK软件IOS贝塞尔曲线
AIWROK软件IOS贝塞尔曲线 hid.moveToRealPoint(333, 1146);:这行代码指示设备(可能是模拟器或自动化测试工具)的hid(Human Interface Device)模块将操作点移动到屏幕上的坐标点(333, 1146)。这个点被定义为曲线的起点。sleep.second(1);:在移动到起点后,程序会暂停1秒钟。这是为了让设备有足够的时间到达起点位置,确保后续操作的准确性。接下来的几行代码定义了贝塞尔曲线的参数:startX 和 startY 定义了曲线的起点。en
信息发布软件AIWROK软件调用多任务随机倒计时函数
AIWROK软件调用多任务随机倒计时函数 代码逐行解释function 多任务随机倒计时(minSeconds, maxSeconds, 任务列表) {定义一个名为 多任务随机倒计时 的函数,该函数接受三个参数:minSeconds:倒计时的最小秒数。maxSeconds:倒计时的最大秒数。任务列表:一个包含多个任务对象的数组,每个任务对象都有一个任务名称和一个任务函数。 var randomInterval = Math.floor(Math.random() * (maxSeconds - minSeconds + 1) + mi
信息发布软件AIWROK软件对接豆包实例分享
AIWROK软件对接豆包实例分享 解释总结:创建一个新的 okHttp 对象实例:var http = new okHttp();创建了一个新的 okHttp 对象实例,并将其赋值给变量 http。okHttp 是一个用于发送 HTTP 请求的库。设置 HTTP 请求头:var aa = uiText.findByID("gd").getText();通过 uiText.findByID 方法找到 ID 为 “gd” 的控件,并获取其文本内容,赋值给变量 aa。uiText.findByID 是一个用于在用户界面上查找特定 ID 的控件的方法,getText
信息发布软件屏幕操作自动化随机点击与滑动函数示例
x和y是百分比形式的屏幕坐标,用于指定点击的大致位置。x范围和y范围定义了在指定坐标点附近点击的随机范围。function 随机位置点击(x, y, x范围, y范围) {定义了一个名为随机位置点击的函数,该函数接受四个参数:x、y、x范围、y范围。 // 将百分比坐标转成真实坐标 var x1 = screen.percentToWidth(x); var y1 = screen.percentToHeight(y);这里将百分比形式的x和y坐标转换为实际屏幕上的像素坐标。screen.percentT
信息发布软件aiwrok软件如何获取getRealPointRGB 获取真实坐标RGB?
getRealPointRGB 获取真实坐标RGB,为什么叫真实坐标 RGB?// 截屏 var img = screen.screenShotFull(); // 定义目标 RGB 值(假设目标图标的 RGB 值为 [255, 0, 0]) var targetRgb = [255, 0, 0]; // 遍历屏幕某区域(例如 [100, 100] 到 [300, 300]),查找目标 RGB 值 var startX = 100; var startY = 100; var endX = 300; var endY = 300; for (var x = startX; x <= endX; x++) { for (var y = start
信息发布软件AIWROK软件京东广告后台意图跳转方法
// 导入包 importClass(Packages.android.content.Intent); importClass(Packages.android.net.Uri); importClass(Packages.android.content.ActivityNotFoundException); importClass(Packages.android.widget.Toast); importClass(Packages.android.os.Handler); importClass(Packages.android.os.Looper); // 设置京东用户页面的URL var userId = "京东用户ID"; // 请替换为实际用户ID var url = "openapp.jdmobile:
信息发布软件AIWROK软件意图跳转支付宝的用户ID打开支付宝用户页面
AIWROK软件意图跳转支付宝的用户ID打开支付宝用户页面importClass(Packages.android.content.Intent); importClass(Packages.android.net.Uri); importClass(Packages.android.content.ActivityNotFoundException); importClass(Packages.android.widget.Toast); importClass(Packages.android.os.Handler); importClass(Packages.android.os.Looper); // 设置支付宝用户页面的URL var userId = "支付宝用户ID"; // 请替
信息发布软件AIWROK软件的对像怎么打印出来呢?
AIWROK软件的对像怎么打印出来呢?对像怎么打印出来呢?// 官方QQ群 711841924 var 手机 = { 手机品牌: "小米", 手机型号: "小米15", 手机颜色: "黑色", 手机产地: "广东" }; // 获取当前时间 var currentTime = new Date().toLocaleTimeString('zh-CN', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); // 自定义打印格式 printl("[" + currentTime + "] #10 【Nativ
信息发布软件AIWROK软件QQ特殊意图跳转
AIWROK软件QQ特殊意图跳转 这段代码的功能是尝试通过安卓设备上的QQ应用展示指定QQ用户的个人资料卡片。如果设备上没有安装QQ应用,则会提示用户并转而通过浏览器打开该用户的QQ空间网页。以下是代码的逐行说明: // 导入包:这只是对接下来几行导入安卓类库的一个注释说明。importClass(Packages.android.content.Intent);:导入安卓Intent类,用于在不同组件之间进行交互,比如从一个应用跳转到另一个应用。importClass(Pack
信息发布软件微信广告意图跳转
微信广告意图跳转// AWIROK软件官方群号711841924// 导入包importClass(Packages.android.content.Intent);importClass(Packages.android.net.Uri);importClass(Packages.android.content.ActivityNotFoundException);importClass(Packages.android.widget.Toast);importClass(Packages.android.os.Handler);importClass(Packages.android.os.Looper);// 设置微信用户页面的URLvar userId = "微信用户ID"; // 请替换为实际用户IDva
信息发布软件AIWROK软件微博意图跳转代码分享
AIWROK软件微博意图跳转代码分享 这段代码的主要功能是尝试在安卓设备上通过微博应用的URL Scheme跳转到指定微博用户的个人页面。如果设备上没有安装微博应用,则会提示用户并尝试通过网页链接打开该用户的微博个人页面。具体解释如下:导入包:首先,代码通过importClass方法导入了一些安卓开发中常用的类。这些类的功能包括:Intent:用于在不同组件之间进行交互,比如启动活动、发送广播等。Uri:表示统一资源标识符,通常
信息发布软件AIWROK软件无障碍获取当前activity地址
AIWROK软件无障碍获取当前activity地址无障碍获取当前activity地址:getCurrentActivity() 是一个方法,其作用是无障礙获取当前活动地址。以下是对其用法的详细分析:方法名称名称:getCurrentActivity()解释:get:表示这是一个获取数据的方法。CurrentActivity:表示获取当前活动(Activity)的地址或其他相关信息。作用:这个方法的作用是获取当前活动的地址,且不会出现障碍(例如无需额外传参或依赖其他复杂逻辑)。返回值返
信息发布软件loadDex 加载插件和TomatoOCR实例演示
说明:可以使用安卓studio 开发出apk,jar,或者dex使用此方法加载模块,注意:插件直接放到插件文件夹中然后上传到手机英文方法: loadDex(plugin),加载插件到系统参数:plugin:插件名称例如导入的插件为 p1.dex,则参数名就填写 loadPlugin(‘p1.dex’)案例://导入dex模块 rhino.loadDex('p1.dex') //导入apk模块 rhino.loadDex('demo.apk')importClass 导入插件中的类方法说明:通过这个方法可以导入插件里编写好的类英文方法:imp
信息发布软件AIWROK软件根据文本和类名查找并点击第一个Facebook节点
根据文本和类名查找并点击第一个Facebook节点展示了如何根据不同的条件使用auto.nodeSearch来查找和点击节点。示例1:根据文本和类名查找并点击第一个Facebook节点// 查找所有文本为 "Facebook" 且类名为 "android.widget.TextView" 的节点 var nodes = auto.nodeSearch(3000).text("Facebook").className("android.widget.TextView"); // 获取找到的第一个节点 var node = nodes.getNode(0); // 点击该节点 node.click()
信息发布软件AIWROK软件字符串大小写转换 字符串大小写转换使用函数
字符串大小写转换 字符串大小写转换使用函数let originalString = "Hello, World!"; let mixedCaseString = originalString.toUpperCase().toLowerCase(); // 实际上是多余的,因为结果和原始字符串的小写形式相同 console.log(mixedCaseString); // 输出: hello, world! // 条件转换示例 function toggleCase(str) { return str === str.toUpperCase() ? str.toLowerCase() : str.toUpperCase(); }
信息发布软件苹果IOS中的HID文件接口文档
苹果IOS中的HID文件接口文档ios操作方法connet连接手机http://192.168.0.112:81/connetscreenshot截屏接口ios屏幕截屏可以指定截屏后的图像尺寸参数:width:宽度height:高度http://192.168.0.112:81/screenshot?width=720&height=1280&compress=100getScreenWidth获取屏幕宽度参数:http://192.168.0.112:81/getScreenWidth鼠标操作方法click点击屏幕真实坐标参数:x:横坐标y:纵坐标http://192.168.0.112:81/click?x=500&y=500
信息发布软件H5调用app和保存配置
本帖最后由 信息发布软件 于 2025-6-27 09:26 编辑 void runJs(function code)h5执行app JS脚本window.at.runJs(function (){ //这里写ATjs代码 printl("你好"); auto.home(); }.toString());void runJsFile(String file) H5运行APP JS文件window.at.runJsFile('主脚本.js');void callFunction(String funname,String arg) H5执行脚本方法window.at.callFun('main',"hello");String getRootPath() 获取项目根
信息发布软件AIWROK软件HID物理按键对应码和组合键用法
本帖最后由 信息发布软件 于 2025-6-26 06:21 编辑 hid.keyPress(0,keycode.A());//在光标后面输入aa//方法1hid.keyPress(0,keycode.Enter());//亮屏//方法2hid.keyPress(0,0x07);//唤醒屏亮屏hid.keyPress(0,0x66);//息屏,关屏HID 键码表功能键按键名称HID 码(十进制)HID 码(十六进制)ESC410x29F1580x3AF2590x3BF3600x3CF4610x3DF5620x3EF6630x3FF7640x40F8650x41F9660x42F10670x43F11680x44F12690x45Backspace420x2ATab430
信息发布软件AIWROK软件里IOS提前复制内容按组进行下标调用
AIWROK软件里IOS提前复制内容按组进行下标调用由于iOS系统采用的是单线程运行机制,这意味着它无法像多线程系统那样在后台同时处理多个任务。因此,在复制操作时,您无法在后台直接复制内容,而是需要通过弹出窗口来完成复制粘贴功能。这种操作方式虽然安全,但在一定程度上会影响操作效率。为了提升工作效率,您可以采用以下方法:提前复制内容:在需要频繁使用某些固定内容时,可以提前将这些内容复制到剪贴板,以便后续快速调用
信息发布软件AIWROK软件里IOS系统如何自动存储和读取配置UI输入框
AIWROK软件里IOS系统如何自动存储和读取配置UI输入框 这段代码是使用AiWork安卓自动化IDE编写的,主要功能是在iOS设备上创建一个包含输入框、单选框和复选框的视图,并实现这些控件的状态保存和值的获取。下面是对代码的详细说明: [*]var vc = new IOSView();:创建一个新的iOS视图对象vc,用于在iOS设备上显示控件。 [*]vc.show(() => { ... });:调用show方法显示视图,并在回调函数中添加控件和设置它们的行
信息发布软件AIWROK软件IOS如何使用webview 实现 h5界面ui加载html代码
AIWROK软件IOS如何使用webview 实现 h5界面ui加载html代码var web = new WebView()web.show();web.loadHtml(`<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>WKWebView JS to Swift</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, sans
信息发布软件AWIROK软件编辑器自定义右键菜单
function setupEditorActions(editor) { // 定义 addAction 函数 function addAction(label, order, textToInsert) { // 添加自定义右键菜单项的逻辑 } // 定义 UIControl 函数 function UIControl(label, order) { // 添加自定义右键菜单项的逻辑 } // 调用 UIControl 函数以添加 "控件调用" 右键菜单项 UIControl('控件调用', 0); // 调用 addAction 函数以添加 "if..."
信息发布软件用AIWROK软件写入表格并读取WROK文件方法
四种不同的方法来处理二维数组数据,并将其保存为CSV或DOCX格式的文件,或者从DOCX文件中读取内容。以下是每种方法的详细说明:第一个方法:原始二维数组,按列保存// 官方交流群711841924 // 第一个方法,原始二维数组,按列保存 var 表格数据 = [ ["1", "110", "130"], // 第一行数据 ["其他数据1", "其他数据2", "其他数据3"], // 第二行数据 ]; // 将二维数组转换为 CSV 格式字符串 var csv数据 = 表格数据
信息发布软件AIWROK软件IOS系统里如何实现ocr识别屏幕文字
AIWROK软件IOS系统里如何实现ocr识别屏幕文字最简单的ocr识别//截图 var img = screen.screenShotFull(); //ocr识别 var ocrres=img.ocr(0, 0, 1, 1) printl(ocrres) //释放内存 否则会内存泄漏 img.close(); 先对图像进行处理后再ocr识别 解决部分文字不准问题//截屏并转成mat格式 var img = screen.screenShotFull(); var mat = img.getMat(); //二值化 opencv.threshold(mat,50,200) //printl(mat) //转成im

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2025-9-16 15:53 , Processed in 0.718297 second(s), 51 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表