如何保存具有透明度的图形
|
该页面正在翻译中。 |
使用GLMakie
using GLMakie
f = Figure(backgroundcolor = (:blue, 0.4))
Axis(f[1, 1], backgroundcolor = (:tomato, 0.5))
f
通过以下技巧,您仍然可以保存具有透明背景的图像。 它的工作原理是设置两种不同的背景颜色,并从差异中用alpha计算前景颜色。
using GLMakie
function calculate_rgba(rgb1, rgb2, rgba_bg)::RGBAf
rgb1 == rgb2 && return RGBAf(rgb1.r, rgb1.g, rgb1.b, 1)
c1 = Float64.((rgb1.r, rgb1.g, rgb1.b))
c2 = Float64.((rgb2.r, rgb2.g, rgb2.b))
alphas_fg = 1 .+ c1 .- c2
alpha_fg = clamp(sum(alphas_fg) / 3, 0, 1)
alpha_fg == 0 && return rgba_bg
rgb_fg = clamp.((c1 ./ alpha_fg), 0, 1)
rgb_bg = Float64.((rgba_bg.r, rgba_bg.g, rgba_bg.b))
alpha_final = alpha_fg + (1 - alpha_fg) * rgba_bg.alpha
rgb_final = @. 1 / alpha_final * (alpha_fg * rgb_fg + (1 - alpha_fg) * rgba_bg.alpha * rgb_bg)
return RGBAf(rgb_final..., alpha_final)
end
function alpha_colorbuffer(figure)
scene = figure.scene
bg = scene.backgroundcolor[]
scene.backgroundcolor[] = RGBAf(0, 0, 0, 1)
b1 = copy(colorbuffer(scene))
scene.backgroundcolor[] = RGBAf(1, 1, 1, 1)
b2 = colorbuffer(scene)
scene.backgroundcolor[] = bg
return map(b1, b2) do b1, b2
calculate_rgba(b1, b2, bg)
end
end
f = Figure(backgroundcolor = (:blue, 0.4))
Axis(f[1, 1], backgroundcolor = (:tomato, 0.5))
f
save("transparent.png", alpha_colorbuffer(f))