Project1

标题: XP版 Graphics.snap_to_bitmap [打印本页]

作者: 神思    时间: 2008-11-28 11:26
标题: XP版 Graphics.snap_to_bitmap
!!!呃``啊``好象发错区了```帮忙转一下``= =```


  1. #==============================================================================
  2. # ■ Graphics
  3. #------------------------------------------------------------------------------
  4. #  进行有关全体图像处理的模块。
  5. #   RMXP 版的 Graphics.snap_to_bitmap
  6. #==============================================================================

  7. class << Graphics
  8.   GetWindowDC = Win32API.new("user32", "GetWindowDC", "l", "l")
  9.   GetDC = Win32API.new("user32", "GetDC", "l", "l")
  10.   GetPrivateProfileString = Win32API.new("kernel32", "GetPrivateProfileStringA", "pppplp", "l")
  11.   FindWindow = Win32API.new("user32", "FindWindowA", "pp", "l" )
  12.   CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  13.   CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  14.   CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  15.   SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  16.   BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  17.   GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  18.   ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  19.   SRCCOPY = 0xCC0020
  20.   #--------------------------------------------------------------------------
  21.   # ● snap_to_bitmap
  22.   #   将当前画面转换为Bitmap对象
  23.   #--------------------------------------------------------------------------
  24.   def snap_to_bitmap
  25.     hb = Bitmap.new(640,480)
  26.     rgbs = self.bitmap_data
  27.     x=y=0
  28.     indexs = [0]
  29.     t1 = Time.now
  30.     for i in indexs
  31.       break if rgbs[i].nil?
  32.       break if rgbs[i+1].nil?
  33.       break if rgbs[i+2].nil?
  34.       break if rgbs[i+3].nil?
  35.       color = Color.new(rgbs[i+2],rgbs[i+1],rgbs[i],rgbs[i+3])
  36.       hb.set_pixel(x,y,color)
  37.       x += 1
  38.       if x == 640
  39.         x = 0
  40.         y += 1
  41.       end
  42.       indexs << i + 4
  43.     end
  44.     t2 = Time.now
  45.     #p t2 - t1
  46.     return hb
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● bitmap_data
  50.   #   获取当前画面的数据部分```
  51.   #   RGB依然是调转过来了`= =``
  52.   #--------------------------------------------------------------------------
  53.   def bitmap_data
  54.     hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  55.     hMemDC = CreateCompatibleDC.call(hScrDC)
  56.     hBitmap = CreateCompatibleBitmap.call(hScrDC, 640, 480)
  57.     #BitBlt.call(hDC, 0, 0, 640, 480, hDC(0), 0, 0, SRCCOPY)
  58.     hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  59.     BitBlt.call(hMemDC, xsrc, ysrc, 640*2, 480*2, hScrDC, 0, 0, SRCCOPY)
  60.     hBitmap = SelectObject.call(hMemDC, hOldBitmap)
  61.     dwCount = (640 * 480 * 4) * 2
  62.     lpBits = "\000" * dwCount
  63.     GetBitmapBits.call(hBitmap, dwCount, lpBits)
  64.     lpBits.delete!("\000")
  65.     return lpBits.unpack("C*")
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 获取DC场景...
  69.   #--------------------------------------------------------------------------
  70.   def hDC(*h)
  71.     if h == []
  72.       return GetWindowDC.call(hWnd)
  73.     else
  74.       return GetDC.call(*h)
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 用户窗口的位置
  79.   #--------------------------------------------------------------------------
  80.   def xsrc
  81.     return self.point[0]
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 用户窗口的位置
  85.   #--------------------------------------------------------------------------
  86.   def ysrc
  87.     return self.point[1]
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 那个点`= =``
  91.   #--------------------------------------------------------------------------
  92.   def point
  93.     point = [0,0].pack("LL")
  94.     ScreenToClient.call(hWnd, point)
  95.     return point.unpack("LL")
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 窗口句柄
  99.   #--------------------------------------------------------------------------
  100.   def hWnd
  101.     game_name = "\0" * 256
  102.     GetPrivateProfileString.call("Game","Title","",game_name,255,".\\Game.ini")
  103.     game_name.delete!("\0")
  104.     return FindWindow.call("RGSS Player",game_name)
  105.   end
  106. end
复制代码



看到之前有人问能不能在XP下实现VX的Graphics.snap_to_bitmap
试了一下..然后.这东西就出来了``

就这样吧```
= =```只是理论出品...
因为set_pixel的惊人速度...所以平均一次要4.5秒左右才出来
作者: 灼眼的夏娜    时间: 2008-11-28 16:19
思思 用内存拷贝= ={/hx}

还有注意ReleaseDC DeleteDC 哪些= =
作者: 雪流星    时间: 2008-11-28 19:22
发动传送技能.....
作者: 柳之一    时间: 2008-11-28 19:54
以下引用灼眼的夏娜于2008-11-28 8:19:53的发言:

思思 用内存拷贝= =

还有注意ReleaseDC DeleteDC 哪些= =


[本贴由作者于 2008-11-28 8:26:55 最后编辑]

用内存也是500ms,总之就这个速度了
作者: 精灵使者    时间: 2008-11-28 19:54
思思啊……这样的话制作XP版新的截图存档就有希望了耶……
作者: TERENCE    时间: 2008-11-28 20:37
有人可以说明一下 这个是干吗用的???
作者: 柳之一    时间: 2008-11-28 20:42
以下引用TERENCE于2008-11-28 12:37:11的发言:

有人可以说明一下 这个是干吗用的???

xp截图用{/hx}
作者: 精灵使者    时间: 2008-11-28 20:45
根据VX的说明文件。
Graphics.snap_to_bitmap (RGSS2)
将当前游戏画面截图存为位图对象。
所指向的是显现出来的图像,与调用 freeze 方法没有关联。
所生成的位图在不使用时必须被释放掉。
作者: Disillusion    时间: 2008-11-28 20:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: TERENCE    时间: 2008-11-28 21:05
以下引用柳之一于2008-11-28 12:42:16的发言:
xp截图用
以下引用精灵使者于2008-11-28 12:45:42的发言:

根据VX的说明文件。
Graphics.snap_to_bitmap (RGSS2)
将当前游戏画面截图存为位图对象。
所指向的是显现出来的图像,与调用 freeze 方法没有关联。
所生成的位图在不使用时必须被释放掉。

感谢二位高手的解释
......

作者: 偶尔探花不雅    时间: 2008-11-28 22:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: hide秀    时间: 2008-11-29 00:12
神思前辈也复出了 {/hx}
作者: yangff    时间: 2008-11-30 03:31
其实,偷偷的说,我只要一个API
作者: Una    时间: 2008-11-30 05:20
以下引用yangff于2008-11-29 19:31:33的发言:

其实,偷偷的说,我只要一个API

如果自己写DLL的话返回一个指针确实可以....
作者: yangff    时间: 2008-11-30 06:11
以下引用Una于2008-11-29 21:20:27的发言:


以下引用yangff于2008-11-29 19:31:33的发言:

其实,偷偷的说,我只要一个API


如果自己写DLL的话返回一个指针确实可以....

但是有个问题就是怎么把PICTURE转成BITMAP
作者: ONEWateR    时间: 2008-11-30 10:27
发布完毕
http://rpg.blue/web/htm/news1202.htm
vip += 2
作者: suicaoya123    时间: 2008-12-5 21:22
以下引用精灵使者于2008-11-28 11:54:44的发言:

思思啊……这样的话制作XP版新的截图存档就有希望了耶……


对啊!....我的超华丽自制素材游戏就有希望了{/cy}
作者: 柳之一    时间: 2009-6-12 08:00
以下引用TERENCE于2008-11-28 13:05:12的发言:


以下引用柳之一于2008-11-28 12:42:16的发言:
xp截图用



以下引用精灵使者于2008-11-28 12:45:42的发言:

根据VX的说明文件。
Graphics.snap_to_bitmap (RGSS2)
将当前游戏画面截图存为位图对象。
所指向的是显现出来的图像,与调用 freeze 方法没有关联。
所生成的位图在不使用时必须被释放掉。


感谢二位高手的解释
......

龙皇客气了
作者: david50407    时间: 2010-7-1 13:18
有个问题:
当窗体被遮蔽一部份时
截图中会变黑色




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1