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

Project1

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

Graphics.snap_to_bitmap 優化2版

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
105
在线时间
67 小时
注册时间
2007-12-16
帖子
75
跳转到指定楼层
1
发表于 2008-12-1 03:12:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
這個優化版
速度快了很多

而且把一些該釋放的釋放掉了

(作截圖存檔請自己找Bitmap的Marshal 找一下就有了)

  1. #==============================================================================
  2. # ■ Graphics.snap_to_bitmap 優化2版
  3. #    原作者:神思
  4. #    優化者:釣到一隻猴子@_@  (  AAM@_@  )
  5. #==============================================================================
  6. #==============================================================================
  7. # ■ Graphics
  8. #------------------------------------------------------------------------------
  9. #  进行有关全体图像处理的模块。
  10. #   RMXP 版的 Graphics.snap_to_bitmap
  11. #==============================================================================

  12. class << Graphics
  13. CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  14. CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  15. CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  16. SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  17. BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  18. GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  19. ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  20. DeleteDC = Win32API.new("gdi32", "DeleteDC", "l", "l")
  21. DeleteObject = Win32API.new("gdi32", "DeleteObject", "l", "l")
  22. SRCCOPY = 0xCC0020
  23. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  24. HWnd = Win32API.new("user32", "GetActiveWindow", nil, 'l').call
  25. DwCount = (640 * 480 * 4) * 2
  26. @@lpBits = "\000" * DwCount
  27. #--------------------------------------------------------------------------
  28. # ● snap_to_bitmap
  29. #   将当前画面转换为Bitmap对象
  30. #--------------------------------------------------------------------------
  31. def snap_to_bitmap
  32.    width, height = 640,480
  33.    hb = Bitmap.new(width, height)
  34.    rgbs = self.bitmap_data
  35.    len = width * 4
  36.    for y in 0...height
  37.      break if 2*y >= height - 1
  38.      nth1 = y * len
  39.      nth2 = (height - 1 - y) * len
  40.      tStr = rgbs[nth1,len]
  41.      rgbs[nth1, len] = rgbs[nth2, len]
  42.      rgbs[nth2, len] = tStr
  43.    end
  44.    RtlMoveMemory.call(hb.address, rgbs, 640 * 480 * 4)
  45.    return hb
  46. end
  47. #--------------------------------------------------------------------------
  48. # ● bitmap_data
  49. #   获取当前画面的数据部分```
  50. #   RGB依然是调转过来了`= =``
  51. #--------------------------------------------------------------------------
  52. def bitmap_data
  53.    hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  54.    hMemDC = CreateCompatibleDC.call(hScrDC)
  55.    hBitmap = CreateCompatibleBitmap.call(hScrDC, 640, 480)
  56.    hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  57.    BitBlt.call(hMemDC, xsrc, ysrc, 640*2, 480*2, hScrDC, 0, 0, SRCCOPY)
  58.    hBitmap2 = SelectObject.call(hMemDC, hOldBitmap)
  59.    GetBitmapBits.call(hBitmap2, DwCount, @@lpBits)
  60.    DeleteDC.call(hScrDC)
  61.    DeleteDC.call(hMemDC)
  62.    DeleteObject.call(hBitmap)
  63.    DeleteObject.call(hOldBitmap)
  64.    DeleteObject.call(hBitmap2)
  65.    return @@lpBits
  66. end
  67. #--------------------------------------------------------------------------
  68. # ● 用户窗口的位置
  69. #--------------------------------------------------------------------------
  70. def xsrc
  71.    return self.point[0]
  72. end
  73. #--------------------------------------------------------------------------
  74. # ● 用户窗口的位置
  75. #--------------------------------------------------------------------------
  76. def ysrc
  77.    return self.point[1]
  78. end
  79. #--------------------------------------------------------------------------
  80. # ● 那个点`= =``
  81. #--------------------------------------------------------------------------
  82. def point
  83.    point = [0,0].pack("LL")
  84.    ScreenToClient.call(HWnd, point)
  85.    return point.unpack("LL")
  86. end
  87. end
  88. #==============================================================================
  89. # ■ Bitmap
  90. #------------------------------------------------------------------------------
  91. #  处理影像的类。
  92. #==============================================================================

  93. class Bitmap
  94. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  95. #--------------------------------------------------------------------------
  96. # ●
  97. #--------------------------------------------------------------------------
  98. def address
  99.    # [[[bitmap.object_id * 2 + 16] + 8] + 16] == 数据的开头
  100.    buffer, ad = "xxxx", object_id * 2 + 16
  101.    RtlMoveMemory.call(buffer, ad, 4)
  102.    ad = buffer.unpack("L")[0] + 8
  103.    RtlMoveMemory.call(buffer, ad, 4)
  104.    ad = buffer.unpack("L")[0] + 16
  105.    RtlMoveMemory.call(buffer, ad, 4)
  106.    return buffer.unpack("L")[0]
  107. end
  108. end
复制代码

Lv1.梦旅人

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
帖子
1361

贵宾

2
发表于 2008-12-1 05:15:38 | 只看该作者
呵呵~不错~
把DC释放后就完美了
-.-
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
105
在线时间
67 小时
注册时间
2007-12-16
帖子
75
3
 楼主| 发表于 2008-12-4 08:01:21 | 只看该作者
以下引用神思于2008-11-30 21:15:38的发言:

呵呵~不错~ 把DC释放后就完美了

沒改到= =

不過速度慢(忽略set_pixel)是曼在圓腳本"\000" * dwCount
這處理時間超過0.1S
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
105
在线时间
67 小时
注册时间
2007-12-16
帖子
75
4
 楼主| 发表于 2009-5-29 07:37:04 | 只看该作者
以下引用神思于2008-11-30 21:15:38的发言:

呵呵~不错~ 把DC释放后就完美了

改好了  



托真久
都半年了= =
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-10-7
帖子
28
5
发表于 2009-5-29 07:46:50 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-2 00:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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