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

Project1

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

[原创发布] Bitmap#blt/#move/#changehue#remove_black

[复制链接]

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
跳转到指定楼层
1
发表于 2022-7-3 22:00:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RPGzh500223 于 2022-8-7 17:35 编辑

RUBY 代码复制
  1. class Bitmap
  2.   dll = "bitmap0.dll"
  3.  
  4.   Blt = Win32API.new(dll, 'blt', 'LLLLLL', 'L')
  5.   Bit_Move = Win32API.new(dll, 'bit_move', 'LLLLL', 'L')
  6.   ChangeHue = Win32API.new(dll, 'changehue', 'LL', 'L')
  7.   ChangehueTo = Win32API.new(dll, 'changehueTo', 'LLL', 'L')
  8.   RemoveB = Win32API.new(dll, 'remove_black_F', 'L', 'L')
  9.   RemoveW = Win32API.new(dll, 'remove_white_F', 'L', 'L')
  10.  
  11.   def to_int
  12.     self.__id__
  13.   end
  14.  
  15.   # 仿Btimap#blt,误差很小,只快了一点点……
  16.   # 建议实际混合区域超过 64*64 大小时使用,超过200行,开了2个线程执行
  17.   # src_bitmap_rect 为 nil 时 即src_bitmap.rect
  18.   def blt0(dx, dy, src_bitmap, src_bitmap_rect = nil, alpha = 255)
  19.     Blt.call(self, dx, dy, src_bitmap, src_bitmap_rect.__id__, alpha)
  20.   end
  21.  
  22.   # 直接复制源位图区域至目标位图的指定位置,特殊的blt
  23.   # src_bitmap_rect 为 nil 时 即src_bitmap.rect
  24.   def move0(dx, dy, src_bitmap, src_bitmap_rect = nil)
  25.     Bit_Move.call(self, dx, dy, src_bitmap, src_bitmap_rect.__id__)
  26.   end
  27.  
  28.   # 参照网上 rgb_to_hsv / hsv_to_rgb 的方法,SSE实现
  29.   # 仿Bitmap#hue_change,前3次误差很小,不适于连续改变色相
  30.   # 建议位图大小超过 10*10 时使用,640*480的理想的大小(w * h => 4 * n)时接近Bitmap#hue_change的5倍
  31.   # hue -360..360
  32.   def changehue!(hue)
  33.     ChangeHue.call(self, hue)
  34.   end
  35.  
  36.   # 适用于连续改变色相的情况(hue参数动态变化)
  37.   # 在前面的方法中无法修复连续改变色相带来的问题,笨办法额外内存备份源数据
  38.   # 源位图(src_bitmap)与目标位图(self)大小需一致
  39.   def changehueTo(src_bitmap, hue)
  40.     ChangeHueTo.call(self, src_bitmap, hue)
  41.   end
  42.  
  43.   # 仿photoshop R、G、B通道滤色去除黑色(0,0,0)背景,与ps结果误差很小
  44.   # 有时精灵加法呈现的效果“失真”,可以考虑试试这个
  45.   def remove_black!
  46.     RemoveB.call(self)
  47.   end
  48.  
  49.   # 白色为(255, 255, 255)
  50.   def remove_white!
  51.     RemoveW.call(self)
  52.   end
  53. end


增加remove_black!方法(640 * 480大小,我的电脑310+次/秒),其余未变

remove_black!的计算说明及演示
RUBY 代码复制
  1. vpt = Viewport.new(0, 0, 640, 480)
  2. vpt.color.set(0, 255, 0)
  3.  
  4. bitmap = Bitmap.new("23.png") # 黑色背景图片
  5. sprite = Sprite.new
  6. sprite.bitmap = bitmap
  7.  
  8. sprite.ox, sprite.oy = bitmap.width / 2, bitmap.height / 2
  9. sprite.x, sprite.y = 320, 240
  10.  
  11. #sprite.blend_type = 1
  12.  
  13.  
  14. bitmap.width.times do |x|
  15.   Graphics.update
  16.   bitmap.height.times do |y|
  17.     color = bitmap.get_pixel(x, y)
  18.     r, g, b = color.red, color.green, color.blue
  19.  
  20.     a = r + g - r * g / 255
  21.     a = a + b - a * b / 255
  22.  
  23.     color.alpha = a
  24.  
  25.     if a != 0
  26.       color.red = r * 255 / a
  27.       color.green = g * 255 / a
  28.       color.blue = b * 255 / a
  29.     end
  30.  
  31.     bitmap.set_pixel(x, y, color)
  32.   end
  33. end
  34.  
  35. loop {Graphics.update}

bitmap0.zip

6.06 KB, 下载次数: 3

bitmap0.dll 2022/8/7

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

本版积分规则

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

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

GMT+8, 2024-4-29 15:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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