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

fangzhu19880123 · August 05, 2020 · Last by fangzhu19880123 replied at September 23, 2020 · 2024 hits

公司主要是为母婴小商户做后台组织提效和小程序商城,商城是一个平台小程序,不同商户不同小程序码入口。所以,需要不同商户可以将自己的 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. 在前端起一个无头浏览器,把这块服务器压力放前端,也比较直接,不过建议第一种,后端好调整。
Reply to zhaoyshine

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

You need to Sign in before reply, if you don't have an account, please Sign up first.