搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker XP 讨论区 Bitmap#blt/#move/#changehue#remove_black: bitmap0.zip

Bitmap#blt/#move/#changehue#remove_black: bitmap0.zip

 

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

             本帖来自P1论坛作者RPGzh500223,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=490198  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
Loading...

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-11-22 13:16 , Processed in 0.050786 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部