查看: 76|回复: 0

[转载发布] Bitmap#blt/#move/#changehue#remove_black

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月九日(秋) | 显示全部楼层 |阅读模式
    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在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-21 03:54 , Processed in 0.047008 second(s), 42 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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