设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2058|回复: 1
打印 上一主题 下一主题

[已经解决] 截图脚本如何添加局部与拆分截图的功能

[复制链接]

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

跳转到指定楼层
1
发表于 2014-11-11 22:49:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
RUBY 代码复制
  1. =begin
  2. 该脚本用于截图,F5为截图快捷键,VXVA通用
  3. =end
  4. #==============================================================================
  5. # ■ Kernel
  6. #------------------------------------------------------------------------------
  7. #  该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。
  8. #==============================================================================
  9. module Kernel
  10.   #--------------------------------------------------------------------------
  11.   # ● 需要的 Windows API 函数
  12.   #--------------------------------------------------------------------------
  13.   GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L")
  14.   GetWindow = Win32API.new("user32", "GetWindow", "LL", "L")
  15.   GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L")
  16.   GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L")
  17.   GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L")
  18.   #--------------------------------------------------------------------------
  19.   # ● 获取窗口句柄
  20.   #--------------------------------------------------------------------------
  21.   def get_hWnd
  22.     # 获取调用线程(RM 的主线程)的进程标识
  23.     threadID = GetCurrentThreadId.call
  24.     # 获取 Z 次序中最靠前的窗口
  25.     hWnd = GetWindow.call(GetForegroundWindow.call, 0)
  26.     # 枚举所有窗口
  27.     while hWnd != 0
  28.       # 如果创建该窗口的线程标识匹配本线程标识
  29.       if threadID == GetWindowThreadProcessId.call(hWnd, 0)
  30.         # 分配一个 11 个字节的缓冲区
  31.         className = " " * 11
  32.         # 获取该窗口的类名
  33.         GetClassName.call(hWnd, className, 12)
  34.         # 如果匹配 RGSS Player 则跳出循环
  35.         break if className == "RGSS Player"
  36.       end
  37.       # 获取下一个窗口
  38.       hWnd = GetWindow.call(hWnd, 2)
  39.     end
  40.     return hWnd
  41.   end
  42. end
  43.  
  44. #==============================================================================
  45. # ■ Bitmap
  46. #------------------------------------------------------------------------------
  47. #  处理影像的类。
  48. #==============================================================================
  49.  
  50. class Bitmap
  51. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  52. #--------------------------------------------------------------------------
  53. # ●
  54. #--------------------------------------------------------------------------
  55. def address
  56.    # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  57.    buffer, ad = "xxxx", object_id * 2 + 16
  58.    RtlMoveMemory.call(buffer, ad, 4)
  59.    ad = buffer.unpack("L")[0] + 8
  60.    RtlMoveMemory.call(buffer, ad, 4)
  61.    ad = buffer.unpack("L")[0] + 16
  62.    RtlMoveMemory.call(buffer, ad, 4)
  63.    return buffer.unpack("L")[0]
  64. end
  65. end
  66.  
  67. #==============================================================================
  68. # ■ Bitmap
  69. #------------------------------------------------------------------------------
  70. #  处理影像的类。
  71. #==============================================================================
  72.  
  73. class Bitmap
  74. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  75. #--------------------------------------------------------------------------
  76. # ●
  77. #--------------------------------------------------------------------------
  78. def address
  79.    # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  80.    buffer, ad = "xxxx", object_id * 2 + 16
  81.    RtlMoveMemory.call(buffer, ad, 4)
  82.    ad = buffer.unpack("L")[0] + 8
  83.    RtlMoveMemory.call(buffer, ad, 4)
  84.    ad = buffer.unpack("L")[0] + 16
  85.    RtlMoveMemory.call(buffer, ad, 4)
  86.    return buffer.unpack("L")[0]
  87. end
  88. end
  89.  
  90.  
  91. #==============================================================================
  92. # ■ Bitmap
  93. #------------------------------------------------------------------------------
  94. #  位图的类。所谓位图即表示图像其本身。
  95. #==============================================================================
  96.  
  97. class Bitmap
  98.   #--------------------------------------------------------------------------
  99.   # ● 传送到内存的API函数
  100.   #--------------------------------------------------------------------------
  101.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  102.   #--------------------------------------------------------------------------
  103.   # ● Bitmap地址
  104.   #--------------------------------------------------------------------------
  105.   # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  106.   def address
  107.     buffer, ad = "rgba", object_id * 2 + 16
  108.     RtlMoveMemory_pi.call(buffer, ad, 4)
  109.     ad = buffer.unpack("L")[0] + 8
  110.     RtlMoveMemory_pi.call(buffer, ad, 4)
  111.     ad = buffer.unpack("L")[0] + 16
  112.     RtlMoveMemory_pi.call(buffer, ad, 4)
  113.     return buffer.unpack("L")[0]
  114.   end
  115.  
  116.   module Bitmap2PNG
  117.     module_function
  118.     Malloc = Win32API.new('msvcrt.dll','malloc','i','i')
  119.     Memcpy_pi = Win32API.new('kernel32.dll','RtlMoveMemory','pii','v')
  120.     Memcpy_ii = Win32API.new('kernel32.dll','RtlMoveMemory','iii','v')
  121.     Memcpy_ip = Win32API.new('kernel32.dll','RtlMoveMemory','ipi','v')
  122.     Free = Win32API.new('msvcrt.dll','free','i','v')
  123.     Callsub = Win32API.new('user32.dll','CallWindowProcW','iiiii','i')
  124.     #--------------------------------------------------------------------------
  125.     # ● 主处理
  126.     #--------------------------------------------------------------------------
  127.     def make_png(bitmap_Fx)
  128.       @bitmap_Fx = bitmap_Fx
  129.       return make_header + make_ihdr + make_idat + make_iend
  130.     end
  131.     #--------------------------------------------------------------------------
  132.     # ● PNG文件头数据块
  133.     #--------------------------------------------------------------------------
  134.     def make_header
  135.       return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
  136.     end
  137.     #--------------------------------------------------------------------------
  138.     # ● PNG文件情报头数据块(IHDR)
  139.     #--------------------------------------------------------------------------
  140.     def make_ihdr
  141.       ih_size = [13].pack("N")
  142.       ih_sign = "IHDR"
  143.       ih_width = [@bitmap_Fx.width].pack("N")
  144.       ih_height = [@bitmap_Fx.height].pack("N")
  145.       ih_bit_depth = [8].pack("C")
  146.       ih_color_type = [6].pack("C")
  147.       ih_compression_method = [0].pack("C")
  148.       ih_filter_method = [0].pack("C")
  149.       ih_interlace_method = [0].pack("C")
  150.       string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
  151.       ih_compression_method + ih_filter_method + ih_interlace_method
  152.       ih_crc = [Zlib.crc32(string)].pack("N")
  153.       return ih_size + string + ih_crc
  154.     end
  155.     #--------------------------------------------------------------------------
  156.     # ● 生成图像数据(IDAT)
  157.     #--------------------------------------------------------------------------
  158.     def make_idat
  159.       header = "IDAT"
  160.       data = make_bitmap_data_dant
  161.       data = Zlib::Deflate.deflate(data)
  162.       crc = [Zlib.crc32(header + data)].pack("N")
  163.       size = [data.length].pack("N")
  164.       return size + header + data + crc
  165.     end
  166.     #--------------------------------------------------------------------------
  167.     # ● 从Bitmap对象的原始数据生成PNG图像数据
  168.     #--------------------------------------------------------------------------
  169.     def make_bitmap_data_dant
  170.       len = @bitmap_Fx.width * @bitmap_Fx.height * 4
  171.       pBuf = Malloc.call(len)
  172.       bitmap=@bitmap_Fx#.reverse
  173.       addr=bitmap.address
  174.       Memcpy_ii.call(pBuf,addr,len)
  175.       Callsub.call(@pCode,pBuf,bitmap.width*bitmap.height,0,0)
  176.       len2=len+bitmap.height
  177.       len3=bitmap.width*4
  178.       pBuf2 = Malloc.call(len2+512)
  179.       pos=pBuf2
  180.       pos2=pBuf+len-len3
  181.       Memcpy_ip.call(pos,0.chr,1)
  182.       pos+=1
  183.       for i in 0...bitmap.height
  184.         Memcpy_ii.call(pos,pos2,len3)
  185.         pos+=len3
  186.         pos2-=len3
  187.         Memcpy_ip.call(pos,0.chr,1)
  188.         pos+=1
  189.       end
  190.       buf="\0"*len2
  191.       Memcpy_pi.call(buf,pBuf2,len2)
  192.       Free.call(pBuf)
  193.       Free.call(pBuf2)
  194. #~       bitmap.dispose
  195.       return buf
  196.     end
  197.     #--------------------------------------------------------------------------
  198.     # ● PNG文件尾数据块(IEND)
  199.     #--------------------------------------------------------------------------
  200.     def make_iend
  201.       return [0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82].pack("C*")
  202.       #ie_size = [0].pack("N")
  203.       #ie_sign = "IEND"
  204.       #ie_crc = [Zlib.crc32(ie_sign)].pack("N")
  205.       #return ie_size + ie_sign + ie_crc
  206.     end
  207.  
  208.     def init
  209.       @pCode=Malloc.call(512)
  210. =begin
  211.       qwe proc src,pixels,un,used
  212.       mov eax,src
  213.       xor ecx,ecx
  214.       .while ecx < pixels
  215.       mov edx,[eax] ;AARRGGBB|BB GG RR AA
  216.       bswap edx ;BBGGRRAA|AA RR GG BB
  217.       ror edx,8 ;AABBGGRR|RR GG BB AA
  218.       mov [eax],edx
  219.       inc ecx
  220.       add eax,4
  221.       .endw
  222.       ret
  223.       qwe endp
  224. =end
  225.       code = [0x55,0x8B,0xEC,0x8B,0x45,0x8,0x33,0xC9,0xEB,0xD,0x8B,0x10,0xF,0xCA,0xC1,0xCA,0x8,0x89,0x10,0x41,0x83,0xC0,0x4,0x3B,0x4D,0xC,0x72,0xEE,0xC9,0xC2,0x10,0x0].pack('C*')
  226.       Memcpy_ip.call(@pCode,code,code.length)
  227.  
  228.     end
  229.  
  230.     def close
  231.       Free.call(@pCode)
  232.     end
  233.  
  234.   end #Bitmap2PNG
  235.  
  236.   def save_png(filename)
  237.     File.open(filename,"wb"){|f|f.write(Bitmap2PNG.make_png(self))}
  238.   end
  239.  
  240. end #Bitmap
  241.  
  242.  
  243. Bitmap::Bitmap2PNG.init
  244. END {Bitmap::Bitmap2PNG.close}
  245.  
  246. class << Graphics
  247.   alias s_update update unless method_defined?(:s_update)
  248.   def update
  249.     Screenshot.shot if Input.trigger?(Screenshot::KEY)
  250.     s_update
  251.   end
  252. end
  253. module Screenshot
  254.  
  255.   KEY = Input::F5        #截图的快捷键
  256.   DIR = "Screenshot"     #截图保存目录
  257.  
  258.   def self.shot
  259.     Dir.mkdir(DIR) unless File.directory?(DIR)
  260.     time_now = Time.now.strftime("%Y-%m-%d %H-%M-%S")
  261.     if File.exist?("#{DIR}/#{time_now}.png")
  262.       index = 2
  263.       index += 1 while File.exist?("#{DIR}/#{time_now}_#{index}.png")
  264.       filename = "#{DIR}/#{time_now}_#{index}.png"
  265.     else
  266.       filename = "#{DIR}/#{time_now}.png"
  267.     end
  268.     Graphics.snap_to_bitmap.save_png(filename)
  269.   end
  270.  
  271. end

这是目前正在用的截图脚本···因为某些问题需要添加局部截图(比如只截取四分之一)的功能···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

Lv1.梦旅人

梦石
0
星屑
50
在线时间
269 小时
注册时间
2014-5-9
帖子
127

开拓者

2
发表于 2014-11-11 23:17:39 | 只看该作者
本帖最后由 泉塚四季 于 2014-11-12 00:19 编辑

最后一句代码中的Graphics.snap_to_bitmap获取了一个bitmap对象,之后调用save_png保存成了文件,所以直接处理这个bitmap对象就好了,例如新建一个指定大小的bitmap然后把这个截图描绘上去后再对这个新bitmap执行save_png

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 认可答案

查看全部评分

泉眼无声惜细流,树阴照水爱晴柔。
小荷才露尖尖角,早有蜻蜓立上头。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 05:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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