じ☆ve冰风 发表于 2024-4-20 01:49:33

Bitmap模糊绘制blur_blt

不知道有没有人写过?相当于把一张bitmap,模糊的绘制到目标bitmap上,虽然用了高斯分布的公式,但不是高斯模糊,只是糊了点

下图是sigma=2.0时的模糊,也可以下载范例尝试:,按左右键调整模糊程度,确认键退出


RUBY 代码
class Bitmap
def blur_blt(src_bitmap, sigma = 1.0)
    blt(0, 0, src_bitmap, src_bitmap.rect)
    returnif sigma < 0.01
    d = 4
    sum = 0.0
    for dx in -d..d
      for dy in -d..d
      sum += Math.exp(-0.5 * (dx * dx + dy * dy) / (sigma * sigma))
      end
    end

    for dx in -d..d
      for dy in -d..d
      alpha = Math.exp(-0.5 * (dx * dx + dy * dy) / (sigma * sigma)) * 255.0 / sum
      nextif alpha < 1
      blt(dx, dy, src_bitmap, src_bitmap.rect, alpha)
      end
    end
end
end

下面是测试代码:
RUBY 代码
b = RPG::Cache.battleback("001-grassland01")
s = Sprite.new
s.bitmap = b.clone

hint = Sprite.new
hint.y = 440
hint.bitmap = Bitmap.new(640, 32)

refresh = Proc.new{ |sigma|
s.bitmap.clear
s.bitmap.blur_blt(b, sigma)
hint.bitmap.clear
hint.bitmap.draw_text(0, 0, 640, 32, "sigma = %.2f" % sigma, 1)
}

sigma = 1.0
refresh.call(sigma)

loopdo
Graphics.update
Input.update
exitif Input.trigger?(Input::C)

if Input.press?(Input::RIGHT)
    sigma += 0.05
    refresh.call(sigma)
elsif Input.press?(Input::LEFT) && sigma > 0
    sigma -= 0.05
    refresh.call(sigma)
end
end

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