package main

import (
   "image"
   "image/color"
   "image/draw"
   "image/png"
   "os"
   "github.com/boombuler/barcode"
   "github.com/boombuler/barcode/code128"
   "golang.org/x/image/font"
   "golang.org/x/image/font/basicfont"
   "golang.org/x/image/math/fixed"
)

func subtitleBarcode(bc barcode.Barcode) image.Image {
   fontFace := basicfont.Face7x13
   fontColor := color.RGBA{0, 0, 0, 255}
   margin := 5 // Space between barcode and text

   // Get the bounds of the string
   bounds, _ := font.BoundString(fontFace, bc.Content())

   widthTxt := int((bounds.Max.X - bounds.Min.X) / 64)
   heightTxt := int((bounds.Max.Y - bounds.Min.Y) / 64)

   // calc width and height
   width := widthTxt
   if bc.Bounds().Dx() > width {
      width = bc.Bounds().Dx()
   }
   height := heightTxt + bc.Bounds().Dy() + margin

   // create result img
   img := image.NewRGBA(image.Rect(0, 0, width, height))
   // draw the barcode
   draw.Draw(img, image.Rect(0, 0, bc.Bounds().Dx(), bc.Bounds().Dy()), bc, bc.Bounds().Min, draw.Over)

   // TextPt
   offsetY := bc.Bounds().Dy() + margin - int(bounds.Min.Y/64)
   offsetX := (width - widthTxt) / 2

   point := fixed.Point26_6{
      X: fixed.Int26_6(offsetX * 64),
      Y: fixed.Int26_6(offsetY * 64),
   }

   d := &font.Drawer{
      Dst:  img,
      Src:  image.NewUniform(fontColor),
      Face: fontFace,
      Dot:  point,
   }
   d.DrawString(bc.Content())
   return img
}

func main() {
   content := "20190428000467889539"
   bcImg, _ := code128.Encode(content)
   scaled, _ := barcode.Scale(bcImg, bcImg.Bounds().Dx(), 80)

   img := subtitleBarcode(scaled)

   f, _ := os.Create("barcode.png")
   defer f.Close()
   png.Encode(f, img)
   //png.Encode(f, scaled)
}
文档更新时间: 2020-02-15 13:02   作者:月影鹏鹏