Freelancer之QRCode

目录

客户发了一个需求如下:

1TODO: 在sortFiles中,获取最新的域名,生成二维码,覆盖QRCodePath图片
2TODO:将QRCodePath图片上传到阿里云0S根目录,重复则覆盖

又具体询问了一下细节,是一个 csharp 的程序

1var sortFiles = Directory.GetFiles(zipPath, "*.zip").Select(fn => new FileInfo(fn)).OrderBy(f => f.LastAccessTime);
2
3// TODO: 在sortFiles中,获取最新的域名(文件名去掉.zip就是域名),结合logoUrl生成二维码,覆盖QRCodePath图片
4
5
6// TODO: 将QRCodePath图片上传到阿里云OOS根目录,重复则覆盖,

看了一下,觉得思路如下,这是个管道流,无论徒手写代码生成QRCODE(还有个logo图需要放到二维码中央),还是集成OSS的SDK都麻烦

最快速方法是直接调用外部成程序做这两步,第一步用Go写个程序生成二维码,第二步用阿里的ossutil64工具上传

一、Go程序Gen出QRCode

go 有很多库,我们直接拿来用好了,但是基本上都是老代码,所以需要下载 go1.13.15 来用

 1# 下载go 1.13.15,解压到E:\go,并建立一个E:\go\go-work目录,下载的模块会放到这里
 2https://dl.google.com/go/go1.13.15.windows-amd64.zip
 3
 4# 设置三个变量
 5GOROOT=E:\go
 6GOPATH=E:\go\go-work
 7PATH中增加好E:\go\bin的目录
 8
 9# 设置一下代理,有时候模块拉不下来
10go env -w GOPROXY=https://goproxy.cn,direct

然后就准备gen qrcode的程序,main.go

  1package main
  2
  3import (
  4	"flag"
  5	"image"
  6	"image/draw"
  7	"image/jpeg"
  8	_ "image/png"
  9	"os"
 10	"path/filepath"
 11
 12	"github.com/LyricTian/logger"
 13	"github.com/nfnt/resize"
 14	"github.com/skip2/go-qrcode"
 15)
 16
 17var (
 18	text    string
 19	logo    string
 20	percent int
 21	size    int
 22	out     string
 23)
 24
 25func init() {
 26	flag.StringVar(&text, "t", "", "二维码内容")
 27	flag.StringVar(&logo, "l", "", "二维码Logo(png)")
 28	flag.IntVar(&percent, "p", 15, "二维码Logo的显示比例(默认15%)")
 29	flag.IntVar(&size, "s", 256, "二维码的大小(默认256)")
 30	flag.StringVar(&out, "o", "", "输出文件")
 31}
 32
 33func main() {
 34	flag.Parse()
 35
 36	if text == "" {
 37		logger.Fatalf("请指定二维码的生成内容")
 38	}
 39
 40	if out == "" {
 41		logger.Fatalf("请指定输出文件")
 42	}
 43
 44	if exists, err := checkFile(out); err != nil {
 45		logger.Fatalf("检查输出文件发生错误:%s", err.Error())
 46	} else if exists {
 47		logger.Fatalf("输出文件已经存在,请重新指定")
 48	}
 49
 50	code, err := qrcode.New(text, qrcode.Highest)
 51	if err != nil {
 52		logger.Fatalf("创建二维码发生错误:%s", err.Error())
 53	}
 54
 55	srcImage := code.Image(size)
 56	if logo != "" {
 57		logoSize := float64(size) * float64(percent) / 100
 58
 59		srcImage, err = addLogo(srcImage, logo, int(logoSize))
 60		if err != nil {
 61			logger.Fatalf("增加Logo发生错误:%s", err.Error())
 62		}
 63	}
 64
 65	outAbs, err := filepath.Abs(out)
 66	if err != nil {
 67		logger.Fatalf("获取输出文件绝对路径发生错误:%s", err.Error())
 68	}
 69
 70	os.MkdirAll(filepath.Dir(outAbs), 0777)
 71	outFile, err := os.Create(outAbs)
 72	if err != nil {
 73		logger.Fatalf("创建输出文件发生错误:%s", err.Error())
 74	}
 75	defer outFile.Close()
 76
 77	jpeg.Encode(outFile, srcImage, &jpeg.Options{Quality: 100})
 78
 79	logger.Infof("二维码生成成功,文件路径:%s", outAbs)
 80}
 81
 82func checkFile(name string) (bool, error) {
 83	_, err := os.Stat(name)
 84	if err != nil {
 85		if os.IsNotExist(err) {
 86			return false, nil
 87		}
 88		return false, err
 89	}
 90	return true, nil
 91}
 92
 93func resizeLogo(logo string, size uint) (image.Image, error) {
 94	file, err := os.Open(logo)
 95	if err != nil {
 96		return nil, err
 97	}
 98	defer file.Close()
 99
100	img, _, err := image.Decode(file)
101	if err != nil {
102		return nil, err
103	}
104
105	img = resize.Resize(size, size, img, resize.Lanczos3)
106	return img, nil
107}
108
109func addLogo(srcImage image.Image, logo string, size int) (image.Image, error) {
110	logoImage, err := resizeLogo(logo, uint(size))
111	if err != nil {
112		return nil, err
113	}
114
115	offset := image.Pt((srcImage.Bounds().Dx()-logoImage.Bounds().Dx())/2, (srcImage.Bounds().Dy()-logoImage.Bounds().Dy())/2)
116	b := srcImage.Bounds()
117	m := image.NewNRGBA(b)
118	draw.Draw(m, b, srcImage, image.ZP, draw.Src)
119	draw.Draw(m, logoImage.Bounds().Add(offset), logoImage, image.ZP, draw.Over)
120
121	return m, nil
122}

上面很简单,用到了别人的三个模块,需要安装一下

1go get -u github.com/LyricTian/logger@latest
2go get -u github.com/nfnt/resize@latest
3go get -u github.com/skip2/go-qrcode@latest

注意,这些命令是针对 go 1.13.15 的,如果用高版本的,命令是不一样的

然后就编译

1go build -o qr.exe main.go

找个中心图,然后测试

 1E:\qr\qr.exe -h
 2Usage of qr:
 3  -l string
 4        二维码Logo(png)
 5  -o string
 6        输出文件
 7  -p int
 8        二维码Logo的显示比例(默认15%) (default 15)
 9  -s int
10        二维码的大小(默认256) (default 256)
11  -t string
12        二维码内容
13
14E:\qr\qr.exe -t "http://www.zz.ha.cn' -l logo.png -o qr.png

就会生成二维码图像

image-20221123105722718

二、用ossutils64.exe上传OSS

这个就简单了,下载阿里的工具,大概是这个样子

1ossutil64.exe  --config-file oss.conf cp 上传文件 s3://桶名/";

三、整合进csharp

这步也比较麻烦,涉及到csharp的单独语法

 1var sortFiles = Directory.GetFiles(zipPath, "*.zip").Select(fn => new FileInfo(fn)).OrderBy(f => f.LastAccessTime);
 2
 3// TODO: 在sortFiles中,获取最新的域名(文件名去掉.zip就是域名),结合logoUrl生成二维码,覆盖QRCodePath图片
 4            for (int i = 0; i < sortFiles.Length; ++i) {
 5                sortFiles[i] = Path.GetFileNameWithoutExtension(sortFiles[i]);
 6
 7                System.Diagnostics.Process process = new System.Diagnostics.Process();
 8                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
 9                startInfo1.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
10                startInfo1.FileName = "qr.exe";
11                string parm01 = string.Format("-t {0} -o {1} -l {2}", sorFiles[i], sortFiles[i], logoUrl"); 
12                startInfo1.Arguments = param01;
13                process.StartInfo = startInfo1;
14                process.Start();
15
16            // TODO: 将QRCodePath图片上传到阿里云OOS根目录,重复则覆盖,AccessKey ID: LTAI5bbbb    AccessKey Secret: NZPwtssss
17                System.Diagnostics.Process process = new System.Diagnostics.Process();
18                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
19                startInfo1.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
20                startInfo1.FileName = "ossutil64.exe";
21                startInfo1.Arguments = "--config-file oss.conf cp sortFiles[i] s3:///";
22                string parm01 = string.Format("-t {0} -o {1} -l {2}", sorFiles[i], sortFiles[i], logoUrl"); 
23                process.StartInfo = startInfo1;
24                process.Start();
25
26            }

关键点有两个:

1、获取sortFiles有后缀,需要去掉

1for (int i = 0; i < sortFiles.Length; ++i) {
2                sortFiles[i] = Path.GetFileNameWithoutExtension(sortFiles[i]);
3}

2、要执行命令,需要后台执行

1                System.Diagnostics.Process process = new System.Diagnostics.Process();
2                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
3                startInfo1.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
4                startInfo1.FileName = "qr.exe";
5                string parm01 = string.Format("-t {0} -o {1} -l {2}", sorFiles[i], sortFiles[i], logoUrl"); 
6                startInfo1.Arguments = param01;
7                process.StartInfo = startInfo1;
8                process.Start();

这样就搞完了,但是,没真机测试啊,go和oss的部分没问题,csharp的部分没有真机,无法验证。


MySQL数据库的备份和恢复之二
Freelancer之aws
comments powered by Disqus