加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 guoxiaomi 于 2022-3-13 00:23 编辑
不知道有没有人写过?相当于把一张bitmap,模糊的绘制到目标bitmap上,虽然用了高斯分布的公式,但不是高斯模糊,只是糊了点
下图是sigma=2.0时的模糊,也可以下载范例尝试:
20220312-blur.zip
(201.29 KB, 下载次数: 24)
,按左右键调整模糊程度,确认键退出
class Bitmap def blur_blt(src_bitmap, sigma = 1.0) blt(0, 0, src_bitmap, src_bitmap.rect) return if 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 next if alpha < 1 blt(dx, dy, src_bitmap, src_bitmap.rect, alpha) end end end end
class Bitmap
def blur_blt(src_bitmap, sigma = 1.0)
blt(0, 0, src_bitmap, src_bitmap.rect)
return if 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
next if alpha < 1
blt(dx, dy, src_bitmap, src_bitmap.rect, alpha)
end
end
end
end
下面是测试代码:
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) loop do Graphics.update Input.update exit if 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
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)
loop do
Graphics.update
Input.update
exit if 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
|