Ruby 使用 rmagic 替换小程序码中间 logo

fangzhu19880123 · 2020年08月05日 · 最后由 fangzhu19880123 回复于 2020年09月23日 · 1743 次阅读

公司主要是为母婴小商户做后台组织提效和小程序商城,商城是一个平台小程序,不同商户不同小程序码入口。所以,需要不同商户可以将自己的 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

可以试下 oss 的 x-oss-process

用无头 chrome 怎么样?

建议上面两种实现方式,不要在后端做图片处理,同时拉的图片多了服务器就崩了,加几台机器都没用。

  1. 用七牛或者阿里云 oss,以打水印的方式来生成图片,来的直接,水印好调整,对后端服务几乎没有什么性能影响。
  2. 在前端起一个无头浏览器,把这块服务器压力放前端,也比较直接,不过建议第一种,后端好调整。
zhaoyshine 回复

需要在后台处理,可以考虑阿里云水印

需要 登录 后方可回复, 如果你还没有账号请 注册新账号