[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 myzam 于 2011-4-8 18:09 编辑

30# broly
没想到这个com还可以进行数学的线性变换。我们用的是
仿射变换---颠覆你的视觉NB

仿射变换的尾巴代表平移。
给一个简单的线性变换--放大2倍的例子吧。对了线性变换是用矩阵表示的。像这样


---说明:这2张图片是用mathtype做的
上述变换在数学上表达的意思是伸张2倍,并平移到坐标为(1,2)的地方。
shotgraph要进行仿射变换,必须用到俩句话:
obj.setgraphicsmode "GM_ADVANCED"   它的常数除了true,false外,其它的常数请大写,这是不爽的地方。
obj.settransformation a11,a12,a21,a22,h,k
a11,a12,a21,a22,h,k这是正交变换的矩阵元素。
旋转 就取这样的矩阵:cos(t),sin(t),-sin(t),cos(t) ,h,k
        调整负号的位置,可以把反射加进去。
t为旋转角度,正的代表逆时针,负的代表顺时针旋转。h,k代表平移坐标。
反射,就这样去矩阵:-1,0,0,1,0,0 关于x轴反射
                     1,0,0,-1,0,0关于y轴反射
                     -1,0,0-1,0,0关于0,0对称
用这个方法翻转字体,比直接用obj.createfont "",0,32,t,true,0,0,0  翻转字体来的快
因为上面这个方法要翻转字体 t=90*20,
原因是 t=90*40字体才旋转一周。也就是说这里的参数1代表的是0.1度。3600shotgraph=360degree
放大2陪就这样取矩阵:2,0,0,2,0,0
                                           2,0,0,2,1,2放大2倍并平移到坐标为1,2的地方。
平移就这样取矩阵 0,0,0,0,12,35  平移到坐标为12,35的地方。
                                
例子如下:我以截屏为例子。
  1. set obj=createobject("shotgraph.image") '连接到com
  2. obj.createimage 320,240,8,创建图片,可以有8种颜色,这也是免费版的最大色数(不是素!)了
  3. obj.setcolor 0,0,255,0 '定义绿色,编号为0,编号可以任意指定。
  4. obj.fillrect 0,0,319,239 ’填充一个rectangle,其实就是创建画布。
  5. OBJ.setgraphicSmode "GM_ADVANCED"    '进入变换模式。这是要进行变换的必要条件,后面的参数是高级的意思,不可以去掉!
  6. OBJ.setTransformation 2,0,0,2,10,10  '进行相似变换
  7. obj.capturescreen 0,0,320,240,450,50  '在屏幕上从坐标(10,10)的地方开始抓一个rectangle屏幕进入内存,然后在一个矩形区域
  8.                                           '显示图片。前4个数字代表矩形区域
复制代码
为了简化计算,在变换时把图片框取方是一个好的技巧。


--------------------------------一个复杂的例子 椭圆的包络线
                                        看了图片你会惊奇它的美,和功能的强大
  1. set obj=CreateObject("shotgraph.image")
  2. size=220
  3. obj.CreateImage size,size,2
  4. obj.SetColor 0,255,255,255
  5. obj.SetColor 1,0,0,0
  6. obj.SetBgColor 0
  7. obj.FillRect 0,0,size-1,size-1
  8. obj.SetDrawColor 1
  9. obj.CreateBrush "BS_NULL",0,""
  10. obj.SetGraphicsMode "GM_ADVANCED"
  11. for i=0 to 179 step 10
  12. ang=i*3.141/180.0
  13. 'Rotate the drawing
  14. obj.SetTransformation Cos(ang),Sin(ang),-Sin(ang),Cos(ang),size/2,size/2
  15. obj.Ellipse -size/2,-size/4,size/2-2,size/4-2
  16. next
  17. img=obj.GifImage(-1,1,"test.gif")
复制代码
这是它的创建的图片
说真的这样的图片,你就是用专业的数学软件,如几何画板,顶级数学软件maple13,也不那么容易画。
椭圆包络线的编程思路是:让椭圆的长轴的端点在大小不同的2个圆上运动就可以了。
当然,它还具有色彩的渐变,剪辑,遮罩,不过有的要付费,就是不付费个人认为用处不大。
想要那种绚丽的艺术效果,那就用FLASH,PS,AI好了。我认为该com的功能是创建几何图形为主。
艺术效果是次要的。
下面这些方格是我用shotgraph的剪辑版(虚拟的,其实就是在内存里面新开辟一个缓冲区,别和系统的剪辑版搞混)画的

------------------------------------------------------------------------------
闪烁的光栅hatche
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,50,0
  7. obj.SetColor 1,&HFF,0,0
  8. obj.setcolor 2,0,&HFF,0
  9. obj.setcolor 3,0,&HFF,&HFF
  10. obj.setcolor 4,&HFF,0,&HFF
  11. obj.setcolor 5,&HFF,&HFF,0
  12. obj.setcolor 6,0,0,&HFF
  13. obj.setcolor 7,0,0,0
  14. obj.SetBgColor 0
  15. obj.FillRect 0,0,xsize,ysize
  16. obj.createfont "",0,32,0,1,0,1,0
  17. obj.settextcolor 2
  18. obj.textout 30,5,"myzam"
  19. for i=0 to 10
  20. for r=0 to 100 step 10
  21. obj.createpen "PS_SOLID",4,(r MOD 6)+1
  22. obj.setbkmode "TRANSPARENT"
  23. OBJ.CREATEBRUSH "BS_HATCHED",(r MOD 6)+2,"HS_CROSS"
  24. obj.ellipse 160-r,120-r,160+r,120+r
  25. obj.trackadd -1,0,0,0,0,xsize,ysize,30     
  26. next
  27. next
  28. obj.trackplay "test.gif"
  29. s.run "f:\test.gif"
  30.   
复制代码




=====================================
这个com可以处理的数学类型有下面这些:

画折线
画多边形
画弧
画弓形
画椭圆饼(数学上叫椭圆扇形,一般office就饼)
画bezier曲线(非常典型,由此可以很方便的模拟出抛物线,正弦线等)
仿射变换(平移,旋转,放大,缩小,弯曲,反射)
除此之外还可以
画字符画(对汉字的处理只能处理几个字)
做动画。
另外还可以创建图片剪辑版(虚拟的),然后可以把图片缓存到clipboard,然后在处理。
这里的剪辑板其实是内存的一个区域,不是系统带的那个clipbrd !
obj.initclipboard 10,10
obj.selectclipboard true
obj.copy 0,0,40,50,10,10 "SRCCOPY"
其它功能:
读取图片(readimage就是要收费,遗憾)
把图片作为数据流处理
可以直接与office对话,从而处理office的图片。但还不如直接用vba。
非注册版本的功能已经够可以的了。
如果有注册版本当然好了。但是我没找到。遗憾。

我的实例
eg.1描点法画抛物线,较慢,gif文件大小为130kb
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=0 to size step 2
  21.         obj.trackadd true,0,0,0,0,size,size,30
  22.         obj.createpen "PS_SOLID",4,1
  23.         obj.line i,size-0.1*(i-120)^2-5,i,size-0.1*(i-120)^2-5
  24. next
  25. obj.trackplay "test.gif"
  26. s.run "test.gif"
复制代码

这是动态的显示描点

这是描点法得到的动画图片,刷新网页可以看到。和下面用变换做的是同样一条抛物线
的图像,用变换法生成的图像动画比这个快的多。


如果不想动态的显示描点,只想显示结果,那么把帧语句obj.trackadd true,0,0,0,0,size,size,30移动动for循环的外面,next的后面就行了。
eg.2 利用平移和反射作抛物线的图像,描点法
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=0 to size-1 step 1
  21.         obj.setgraphicsmode "GM_ADVANCED"
  22.         obj.settransformation 1,0,0,1,i+120,0.2*i^2
  23.         obj.createpen "PS_SOLID",4,1
  24.         obj.line i,0,i,0
  25.         obj.settransformation -1,0,0,1,size-i-120,0.2*i^2
  26.         obj.line i,0,i,0
  27. next
  28. obj.gifimage -1,0,"test.gif"
  29. s.run "test.gif"
复制代码
其实关键的语句没这么多,就是for。。。next那几句,其它的是废话。就是为了好看一点吧了。
下面是利用平移变换作的图,刷新网页,看以看到动画

例子:利用bezier贝塞尔方法创建曲线轨迹
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. size=240
  4. obj.CreateImage size,size,8
  5. obj.SetColor 0,0,255,0
  6. obj.SetColor 1,0,0,255
  7. obj.setcolor 2,255,0,0
  8. obj.setcolor 3,0,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,size-1,size-1
  11. obj.createpen "PS_SOLID",3,2
  12. obj.line 0,size-4,size,size-4
  13. obj.line 120,0,120,size
  14. obj.createfont "ARIAL",0,24,0,true,0,0,0
  15. obj.settextcolor 3
  16. obj.setbkmode "TRANSPARENT"
  17. obj.gettextdimensions "x-axies",u,v
  18. obj.textout size-u-2,size-v-2,"x-axies"
  19. obj.textout 120,0,"y-axies"
  20. for i=2 to 51 step 5
  21.         obj.createpen "PS_SOLID",1,1
  22.         obj.polybezier array(0,0,i+118,0.1*i^2,i+122,0.1*(i+2)^2,240,0)
  23.         obj.trackadd true,0,0,0,0,size,size,30
  24. next
  25. obj.trackplay "test.gif"
  26. s.run "test.gif"
复制代码
生成的动画图片如下,刷新网页可以看到动画。


利用bezier方法创建的曲线系文件很小。这是因为它采用的是多项式插值推算出来的,不是一点一点的描出来的。
所以数学函数的模拟尽量采用插值发,以减小文件的大小。这个图片才16kb。如果是描点的话,
大概要达到200kb的样子,差别是非常大的。

例子:直方图
  1. set s=createobject("wscript.shell")
  2. Set g=CreateObject("shotgraph.image")
  3. x=320
  4. y=240
  5. g.createimage x,y,8
  6. g.setcolor 0,100,0,255
  7. g.setcolor 1,255,0,0
  8. g.setcolor 2,0,255,0
  9. g.setbgcolor 0
  10. g.fillrect 0,0,x-1,y-1
  11. for i=0 to 11   
  12.   g.setbgcolor (i mod 2)+1
  13.   if y-i*50>=0 then
  14.      g.fillrect i*30,y-i*50,i*30+30,y
  15.   else
  16.      g.fillrect i*30,i*50-y,i*30+30,y
  17.   end if
  18. next
  19. g.gifimage true,0,"test.gif"
  20. s.run "test.gif"
复制代码
===============
例子:微积分中的曲边梯形动画
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,255,0
  7. obj.SetColor 1,0,0,255
  8. obj.setcolor 2,255,0,0
  9. obj.SetBgColor 0
  10. obj.FillRect 0,0,xsize,ysize
  11. sub my()
  12. n=inputbox("Please number:")
  13. h=xsize/n
  14. for i=0 to n-1
  15.     xi=0+i*h
  16.     yi=0.005*(xi+h/2)^2
  17.   if ysize-yi >=0 then
  18.     obj.setbgcolor (i mod 3)+1
  19.     obj.fillrect xi,ysize,xi+h,ysize-yi
  20.     obj.trackadd -1,0,0,0,0,xsize,ysize,30
  21.   else
  22.     exit for
  23.   end if
  24. next
  25. end sub
  26. call my()
  27. obj.trackplay "test.gif"
  28. s.run "test.gif"
复制代码
刷新网页,可以看到动画:y=x*x*0.0056的曲边梯形


-----------------------------------------------------
例子:抛物线的曲边梯形2--y=0.005*x^2
  1. ''''####Editer:myzay 2011-4-5#########
  2. set s=createobject("wscript.shell")
  3. set obj=CreateObject("shotgraph.image")
  4. xsize=320
  5. ysize=240
  6. obj.CreateImage xsize,ysize,8
  7. obj.SetColor 0,0,255,0
  8. obj.SetColor 1,0,0,255
  9. obj.setcolor 2,255,0,0
  10. obj.setcolor 3,200,10,125
  11. obj.setcolor 4,125,200,50
  12. obj.SetBgColor 0
  13. obj.FillRect 0,0,xsize,ysize
  14. call my()
  15. function my()
  16.     for n=10 to 50
  17.         
  18.         h=xsize/n
  19.         
  20.         
  21.         obj.gettextdimensions "100Number Of Iterate",x1,y1
  22.         obj.createfont "Arail",0,32,1800,true,true,true,true
  23.         obj.setbKmode "TRANSPARENT"
  24.         obj.settextcolor (n mod 2)+3
  25.         obj.textout x1+10,y1+20,"Number Of Iterate:"&n-9
  26.    for i=0 to n-1
  27.            
  28.            xi=0+i*h
  29.            yi=0.005*(xi+h/2)^2
  30.            if ysize-yi >=0 then
  31.            obj.setbgcolor (i mod 3)+1
  32.            obj.fillrect xi,ysize,xi+h,ysize-yi
  33.            obj.trackadd -1,0,0,0,0,xsize,ysize,20
  34.          
  35.     else
  36.            exit for
  37.     end if
  38.     next
  39.     obj.SetBgColor 0
  40.     obj.FillRect 0,0,xsize,ysize
  41. next
  42. end function
  43. obj.trackplay "test.gif"
  44. s.run "f:\test.gif"
  45.   
复制代码
动画文件为1.25mb,请稍等。要重复播放,请刷新网页。



----------------------------------------------------

函数图像画法有3法:
  法1:老老实实的描点
  法2:平移变换法
  法3:贝塞尔方法。这种方法是曲线的近似画法,数学上叫曲线的拟合。
  法4:折线法obj.polyline,采用极限的思想,把区间细分一下,如分为30段,就可以达到很好的效果,而且文件还小。
   给个例子:
  1. set s=createobject("wscript.shell")
  2. set obj=CreateObject("shotgraph.image")
  3. xsize=320
  4. ysize=240
  5. obj.CreateImage xsize,ysize,8
  6. obj.SetColor 0,0,255,0
  7. obj.SetColor 1,0,0,255
  8. obj.setcolor 2,255,0,0
  9. obj.setcolor 3,200,10,125
  10. obj.setcolor 4,125,200,50
  11. obj.SetBgColor 0
  12. obj.FillRect 0,0,xsize,ysize
  13. arr=array( _
  14. 100,100,110,50,120,100,130,50,140,100,_
  15. 150,50,160,100,170,50,180,100,200,50,220)
  16. obj.setdrawcolor 2
  17. obj.polyline "",arr
  18. obj.line 0,160,230,160
  19. obj.line 100,10,100,300        
  20. obj.gifimage -1,0,"test.gif"
  21. s.run "f:\test.gif"
复制代码

  利用帧来创建图片就可以了。如果要想文件小点,快点,就获取图片的最后结果,只用一帧就可以了。,如果
  喜欢慢慢的欣赏画图的过程,那就要用多帧。
  如果你希望图片上的点不离散,那就取小数步长,这时动画是很慢的哦。
  玩家可能觉得奇怪,既然画图是这么的重要,为啥vbs不自带一个功能强大一点的方法?
  原因是这样的:vbs被微软设计成了一个类似于仪表盘的东西。
  仪表盘上的每一个按钮就是vbs的基本语句和基本方法,基本属性。
  vbs脚本所要做的就是让我们去按动按钮,然后调用com,通过com(控件)去完成各种复杂的事情。
  vbs没有画图的方法,这是由微软打造vbs的主导思想决定的。并不是微软办不到。
由此看来这个组件叫shotgraph是很妙的叫法了。shot---射击,graph---图表。合起来就是射击图表。
就是说你的vbs脚本就像一把枪的扳机,com就是你的子弹,你扣动扳机,就是调用com。这一枪出去,你就射出了一幅图像。
  这就是为什么叫shot  graph射图的原因,你说取的妙不妙?!vbs脚本是扳机,com是你的子弹,没有com的vbs就如没有子弹的枪。

  我查看了一下API函数列表,估计shotgraph就是调用的API函数。比如api函数中有textout,这里也有。
  遗憾的是我对API函数只认识A---P--I,除此之外是一篇空白,将来也不想去学。太累。
  该组件就一个文件在windows\system32\shotgraph.dll
   我打开文件看了,是C++ 编写的。它就是注册了一com。在里面可以看到它在注册表中的键位。
-------------------------------------------------------------
结束语:
      如果你想有效的使用shotgraph的各种方法,请创建画布吧---obj.fillrect 0,0,size1,size2
         如果你觉得图片小了,那就保存为test.swf吧。
      该com的要点是--矩形是基础,对角线是关键。
      我看重这个com,因为它的创建图片的功能不比专业的数学软件差。
      几何画板作图的功能够强大了吧,世界级的顶级数学软件Maple13画图的功能也足够强大了吧.
        它们都是有几十兆到几百兆的大小。
      而shotgraph就几十kb,居然达到了这样的颠覆你视觉的效果,说句真话,那些顶级的数学软件应该汗颜!
      说道这里让我想起了微软的公式编辑器,大家都以为那是微软的专利,其实大错特错!
      那是微软花了money买的Design Science公司的产品Mathtype的简化版。如果你装上原版的Mathtype那
      功能,没讲的。它让你直接可以使用LETEX语言输入科技符号。
      所以,我在想说不定哪天微软再花money把shotgraph买了,这不是没有可能,
      如果这样的事情发生了,那是玩家们的福音。呵呵。有点dream哈。
      编程对我来说就是玩,对我并没什么大的用处。我想对大多数人也是这样。
      因此,我祝各位玩家玩的愉快。
      由于时间的关系,水平的限制,错误是难免的,欢迎各位玩家指出,我会及时改正的。

        忘记最重要的一点了。由于这个版本是非注册版本,gif的大小是320x240,jpeg的大小为200x200.
       其实这不是问题,因为flash软件给我们提供了转变方法:你只要把文件导入flash的舞台,让后让flash的画布与
    gif文件一样大,接着导出来就是了,在导出文件时flash会提示你选择什么文件,你选择比如gif动画,点确定,
    flash又提示你文件的大小设置,这时你输入800x600,就可以改变gif动画的大小了。相信flash效果很好。
     我在使用中发现,下面的方法可以 突破非注册版尺寸的限制---------借助于flash播放器---------
       set oshell=createobject("wscript.shell")
       oshell.run "saflashplayer test.gif"
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

本帖最后由 myzam 于 2011-4-18 17:42 编辑

如何学习wmic?
  下面举例说明如何去查看wmic的帮助。其实要记住成千的wmic命令是很难的。因而学会察看wmic才帮助才是出路。
其实也没必要记那些命令。除非你要去参加考试。
假如f盘有一个文件叫test.txt
1---输入命令
   wmic  datafile where name='f:\\test.txt' get /value
   这时将显示关键字 createclassname=cim_logicalfile
  这就是此时,我们用到的类。
   我们首先要学会查看类的属性和方法,类里有和属性,有和方法。因为类的属性和方法才是我们要调用的东西。
背它没必要!
2---查看类样子 输入命令
  wmic  class  cim_logicalfile  get
这时你看到的是xml标签语言。不属习的人是读不懂的,就是属性标签语言的人,我想读起来也不会是一种享受。
怎么办?
这时我们输出它们到网页。如何输出到网页?用下面的命令好了:
wimc  /record:f:\test.htm class cim_logicalfile get
此时你去打开文件 f:\test.htm类cim_logicalfile的方法,属性就显示在你眼前了。
3---使用类的属性和方法

从图片中你可以看到该类有属性如 name,有方法如 copy,copyex。
利用属性:
wmic  path cim_logicalfile  where  name='f:\test.txt'  get /value
利用方法:
wimc  path cim_logicalfile where name='f:\test.txt'  call copy f:\test123.txt
问题来了compress方法是什么意思,论坛求助?估计无人回答你,网络找解答,估计还是没有你满意的结果。怎么办?
查看帮助啊?
如何查看?方法如下:
compress是压缩之意,
你输入下面的命令看看如何:
wmic path cim_logicalfile where name='f:\test.txt' call compress  /?
这时你发现这个帮助看了半天还是不明白。那你用下面的方法试试看:
wmic path cim_logicalfile  where name='f:\test.txt' call compress  /?:full
这时详细的帮助出来了。



总之,学习命令语言和学习一般的编制语言的方法是不同的。学习命令语言关键是学会如何查看帮助!

感谢:感谢网友的指出。再编辑中漏掉了 where。现补上。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

简单的说一下,楼上好像少了不少WHERE啊
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

返回列表