公司主要是为母婴小商户做后台组织提效和小程序商城,商城是一个平台小程序,不同商户不同小程序码入口。所以,需要不同商户可以将自己的 logo 替换小程序码中间的 logo,微信官方没找到合适的方式,就用 rmagic 写了一个。还有一个问题暂时不知道怎么解决,中间 logo 边缘锯齿比较明显,用了几种方式没啥效果,待优化。
# 替换小程序码中间logo
def composite_wxacode_image_with_logo(wxacode_file, logo_path)
radius = 63
diameter = radius * 2
# 画一个白色的圆,避免logo图是png的时候看到原小程序码中间图片
gc = Magick::Draw.new
gc.stroke('white').stroke_width(radius)
gc.circle(radius, radius, radius/2, radius)
# 把logo做成小程序码中间圆形logo的形状和大小
logo_img = Magick::Image.read(logo_path).first
pr = Magick::Draw.new
pr.define_clip_path('circle') {
pr.circle radius, radius, radius, 0
}
pr.push
pr.clip_path('circle')
pr.composite(0, 0, diameter, diameter, logo_img)
pr.pop
# 先画白色圆
canvas1 = Magick::Image.new(diameter, diameter) { |c| c.background_color = "Transparent" }
gc.draw(canvas1)
# 把logo画上去
canvas2 = Magick::Image.new(diameter, diameter) { |c| c.background_color = "Transparent" }
pr.draw(canvas2)
# 把logo盖在小程序码上
wxacode_img = Magick::Image.read(wxacode_file).first
# 这里不用同一个image去覆盖是因为在一个image上先画白色圆在画logo的时候,会有黑色锯齿边框,改成合成两次image
wxacode_img.composite!(canvas1, 77, 77, Magick::OverCompositeOp)
wxacode_img.composite!(canvas2, 77, 77, Magick::OverCompositeOp)
dest_path = File.join(PomeloBackend.root, 'tmp', "#{Tools.fill_code}.png")
wxacode_img.write(dest_path)
dest_path
end