-
采用的是 go 来实现的, 采用 gin 框架, 处理图像采用 bild 包,只是使用了调整大小的功能.
原本使用 bimg 包, 但是依赖太严重了(因此不能交叉编译) -
图片来源于互联网, 主要来自 c 站
- docker 的安装
- 二进制安装
- 自行通过编译安装
-
- 下载 docker-compose.yml 文件, 并且修改
assets
目录为实际图片资源目录
- 下载 docker-compose.yml 文件, 并且修改
services:
randomimages:
container_name: randomimages-server
image: qqzsc/randomimages:latest
# image: ghcr.io/zoushucai/randomimages:latest
restart: always
ports:
- "9113:9113"
volumes:
# 需要准好图片资源文件夹
- ./../assets:/app/assets
- ./logs:/app/logs
然后运行 sudo docker-compose up
就可以通过 http://localhost:9113/v1/random
访问了
- 从仓库下载对应平台的二进制文件, 然后解压,在终端中运行
./randomimages
即可启动服务
- 首先,准备好 go 环境, 以及必要的依赖.
wget https://go.dev/dl/go1.23.0.linux-amd64.tar.gz
sudo tar -xzvf go1.23.0.linux-amd64.tar.gz -C /usr/local
echo 'export PATH="$PATH:/usr/local/go/bin"' >> ~/.zshrc
source ~/.zshrc
echo 'export PATH=$(go env GOPATH)/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
rm go1.23.0.linux-amd64.tar.gz
-
准备好图片资源, 把图片放到
assets
目录下, 如果要对图片进行分类, 可以在assets
目录下新建文件夹, 把图片放到对应的文件夹下. 例如assets/cat
文件夹下的图片, 就是猫的图片. -
准备好 go 环境, 并且安装好 go. 然后就是一些列的初始化工作
# 1.初始化项目
go mod init mygo
# 2. 下载依赖
go mod tidy
# 3. 编译启动
go run main.go
# 4. 如果不报错, 就可以通过 http://localhost:9113/v1/random 访问图片
# 5. 就可以打包成二进制文件
go build -o main main.go
# 6. 通过二进制文件启动
./main
# 7. 编译的时候添加 -ldflags="-s -w" 可以减少二进制文件大小
go build -ldflags="-s -w" -o main main.go
# 8添加参数, 指定端口和图片路径
./main --port=9113 --imgdir=imgs
-
假设:
url = http://localhost:9113/v1/random
-
访问
url?sub=xxx&width=xxx&height=xxx&index=xxx
即可获取指定的图片,(图片的类型包括:jpeg, png, gif
)-
sub
: 文件夹名称, 例如url?sub=cat
即可获取assets/cat
文件夹下的图片 -
width
: 图片宽度, 默认为 0(pc 端), 非 pc 端默认为 300. -
height
: 图片高度, 默认为 0- 如果
width
和height
都为 0, 则默认为原始图片的宽度 - 如果二者只要一个为 0, 则调整为指定的宽高(保持比例)
- 如果都大于 0, 则调整到指定的宽高(拉伸)
- 如果
-
index
: 索引, 例如url?index=1
即可获取索引为 1 的图片(按顺序), 如果未指定, 则默认为随机获取 -
上述选项是可以组合使用的
-
-
新支持 webp, 由于 webp 的格式问题, 只能访问,不能调整大小
# example -- 直接返回图片
http://localhost:9113/v1/random?sub=dongman&index=0
# 如果要返回 json,
curl -H "Accept: application/json" http://localhost:9113/v1/random
# 返回
{"file":"assets/renwu/00059-3052920575-masterpiece.png","message":"success"}
# 这里的 file 是图片的 url, 直接把 assets 目录下的所有图片进行了挂载, 因此可以通过这个地址直接访问图片
# message 是返回的提示信息
# 还可以通过 swagger 来查看接口文档(这个会使得编译后的体积大 3 倍,算了,还是添加上, 方便了解 api)
# http://localhost:9113/swagger/index.html
- 还提供图片上传的功能, 更多 api 细节参考: http://localhost:9113/swagger/index.html
不想折腾, 推荐第三方程序: goreleaser
- 注意: 如果项目底层依赖 c 库,则可能交叉编译的时候会失败
- 参考本仓库的
.github/workflows
文件
- 为了不引入 cgo, 因为对图片的裁剪是不成功的, 由于涉及图片拷贝等操作, 镜像 scratch 难以胜任, 因此选 alpine:latest 为基础镜像
-
直接从 swagger 进行查看
├── Dockerfile
├── assets # 图片资源
├── dbpk # 数据库文件
├── docs # swagger生成的文档
├── example # 示例代码
├── go.mod
├── go.sum
├── logger # 日志配置
├── main.go # 入口文件
├── middlewares # 中间件
├── pics # 图片处理
├── ports # 强制杀死进程(暂时没用到)
├── readme.md
├── routers # 路由
├── settings # 配置文件, 由于没有用配置文件,直接把配置文件写在 go 文件中
├── static # 静态文件
└── utils # 工具类