- 新增 imglib 包,支持 FilePath/URL/Base64 三种图片输入方式 - 纯白占比检测、白底居中合成、等比缩放、去白边、裁切 - 二维码生成与识别、条形码生成(Code128/EAN13/Code39) - 中文文字图片、书籍信息水印、通用水印叠加 - 输出辅助:EncodeToBytes/EncodeToBase64/SaveToFile/SaveJPEG/SavePNG - 字体缓存,避免重复加载 - 完整测试覆盖(23个测试用例)
240 lines
5.6 KiB
Markdown
240 lines
5.6 KiB
Markdown
# daShangDao_utils
|
||
|
||
**版本: v1.0.0** | 图片处理工具库
|
||
|
||
提供统一的图片加载接口(支持文件路径/网络 URL/Base64 三种输入方式),包含纯白检测、缩放、裁切、去白边、二维码/条形码生成识别、中文水印等完整图片处理能力。
|
||
|
||
---
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
go get github.com/你的用户名/daShangDao_utils/imglib
|
||
```
|
||
|
||
然后导入:
|
||
|
||
```go
|
||
import "github.com/你的用户名/daShangDao_utils/imglib"
|
||
```
|
||
|
||
---
|
||
|
||
## 核心类型
|
||
|
||
### ImageInput(统一图片输入源)
|
||
|
||
`ImageInput` 是本库的核心输入类型,支持 **三种图片加载方式**,任意设置一个即可:
|
||
|
||
```go
|
||
// 方式一:从磁盘文件加载
|
||
input := imglib.NewImageInputFromFile("/path/to/image.jpg")
|
||
|
||
// 方式二:从网络 URL 加载
|
||
input := imglib.NewImageInputFromURL("https://example.com/image.png")
|
||
|
||
// 方式三:从 Base64 字符串加载(自动处理 data:image/ 前缀)
|
||
input := imglib.NewImageInputFromBase64("iVBORw0KGgo...")
|
||
|
||
// 统一加载方法
|
||
img, format, err := input.Load()
|
||
```
|
||
|
||
---
|
||
|
||
## API 文档
|
||
|
||
### 纯白占比检测
|
||
|
||
```go
|
||
pct, err := imglib.CalculateWhitePercentage(input)
|
||
// pct: 0.0 ~ 1.0 之间的纯白像素占比
|
||
```
|
||
|
||
### 白底居中合成
|
||
|
||
```go
|
||
rgba, err := imglib.CreateWhiteBottomCenteredImage(input, width, height)
|
||
// 在 width×height 的白色背景上居中放置原图
|
||
```
|
||
|
||
### 等比高度缩放
|
||
|
||
```go
|
||
img, err := imglib.ResizeToHeight(input, targetHeight)
|
||
// 按目标高度等比例缩放,Lanczos3 插值
|
||
```
|
||
|
||
### 自适应尺寸缩放
|
||
|
||
```go
|
||
rgba, err := imglib.ResizeToDimensions(input, dstWidth, dstHeight)
|
||
// 按目标宽高等比例缩放,自实现 Lanczos3 算法
|
||
```
|
||
|
||
### 去白边
|
||
|
||
```go
|
||
img, err := imglib.RemoveWhiteBorder(input)
|
||
// 自动检测白色边框并裁剪,默认阈值 240
|
||
|
||
img, err := imglib.RemoveWhiteBorderWithConfig(input, threshold, margin)
|
||
// threshold: 检测阈值(0-255),margin: 保留边距(像素)
|
||
```
|
||
|
||
### 图片裁切
|
||
|
||
```go
|
||
rgba, err := imglib.Crop(input, x, y, width, height)
|
||
// 按指定矩形区域裁切
|
||
```
|
||
|
||
### 二维码识别
|
||
|
||
```go
|
||
text, err := imglib.ScanQRCode(input)
|
||
// 返回二维码中的文本内容
|
||
|
||
text, qrImg, err := imglib.ScanQRCodeWithBounds(input)
|
||
// 返回文本内容 + 裁剪后的二维码区域图片
|
||
```
|
||
|
||
### 二维码生成
|
||
|
||
```go
|
||
img, err := imglib.GenerateQRCode(content, width, height)
|
||
// content: 二维码内容, width/height: 图片尺寸
|
||
```
|
||
|
||
### 条形码生成
|
||
|
||
```go
|
||
// 支持三种编码类型:
|
||
img, err := imglib.GenerateBarcode(imglib.Code128, "1234567890")
|
||
img, err := imglib.GenerateBarcode(imglib.EAN13, "1234567890123")
|
||
img, err := imglib.GenerateBarcode(imglib.Code39, "ABC-123")
|
||
```
|
||
|
||
### 中文文字图片
|
||
|
||
```go
|
||
img, err := imglib.CreateChineseTextImage(text, width, height, fontSize)
|
||
// 将中英文文本渲染为图片,超长自动换行并显示省略号
|
||
```
|
||
|
||
### 书籍信息水印
|
||
|
||
```go
|
||
// 先在现有 RGBA 图片上绘制书名/作者/出版社
|
||
err := imglib.DrawChineseInfo(rgba, "书名", "作者", "出版社")
|
||
```
|
||
|
||
### 通用水印
|
||
|
||
```go
|
||
result, err := imglib.ApplyWatermark(imglib.WatermarkConfig{
|
||
SourceImage: imglib.NewImageInputFromFile("source.jpg"),
|
||
WatermarkImg: imglib.NewImageInputFromBase64(b64data),
|
||
Opacity: 0.5, // 不透明度
|
||
Position: "bottom-right", // center/top-left/top-right/bottom-left/bottom-right/tile
|
||
Scale: 0.3, // 水印缩放比例
|
||
XOffset: 10,
|
||
YOffset: 10,
|
||
})
|
||
```
|
||
|
||
**`Position` 可选值**:
|
||
|
||
| 值 | 说明 |
|
||
|------|------|
|
||
| `center` | 居中 |
|
||
| `top-left` | 左上角 |
|
||
| `top-right` | 右上角 |
|
||
| `bottom-left` | 左下角 |
|
||
| `bottom-right` | 右下角 |
|
||
| `tile` | 平铺 |
|
||
|
||
### 输出辅助
|
||
|
||
```go
|
||
// 编码为字节数组
|
||
bytes, err := imglib.EncodeToBytes(img, "jpeg", 95)
|
||
|
||
// 编码为 Base64 字符串(带 data:image/ 前缀)
|
||
b64, err := imglib.EncodeToBase64(img, "png", 95)
|
||
|
||
// 保存到文件(自动根据扩展名选择格式)
|
||
err := imglib.SaveToFile(img, "output.png")
|
||
|
||
// 保存为 JPEG
|
||
err := imglib.SaveJPEG(img, "out.jpg", 95)
|
||
|
||
// 保存为 PNG
|
||
err := imglib.SavePNG(img, "out.png")
|
||
```
|
||
|
||
---
|
||
|
||
## 完整示例
|
||
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/你的用户名/daShangDao_utils/imglib"
|
||
)
|
||
|
||
func main() {
|
||
// 1. 从 URL 裁切图片
|
||
cropped, err := imglib.Crop(
|
||
imglib.NewImageInputFromURL("https://example.com/photo.jpg"),
|
||
100, 50, 400, 300,
|
||
)
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
imglib.SaveJPEG(cropped, "cropped.jpg", 95)
|
||
|
||
// 2. 从 Base64 识别二维码
|
||
text, err := imglib.ScanQRCode(
|
||
imglib.NewImageInputFromBase64("iVBORw0KGgoAAAANSUhEUg..."),
|
||
)
|
||
fmt.Println("二维码内容:", text)
|
||
|
||
// 3. 从本地文件去白边
|
||
cleaned, err := imglib.RemoveWhiteBorder(
|
||
imglib.NewImageInputFromFile("scan.png"),
|
||
)
|
||
imglib.SavePNG(cleaned, "cleaned.png")
|
||
|
||
// 4. 从 URL 添加 Base64 水印
|
||
result, err := imglib.ApplyWatermark(imglib.WatermarkConfig{
|
||
SourceImage: imglib.NewImageInputFromURL("https://example.com/book.jpg"),
|
||
WatermarkImg: imglib.NewImageInputFromBase64("iVBORw0KGgo..."),
|
||
Opacity: 0.8,
|
||
Position: "center",
|
||
})
|
||
b64, _ := imglib.EncodeToBase64(result, "jpeg", 95)
|
||
fmt.Println("水印结果:", b64[:50]+"...")
|
||
|
||
// 5. 生成二维码并保存
|
||
qr, _ := imglib.GenerateQRCode("https://example.com", 300, 300)
|
||
imglib.SavePNG(qr, "qrcode.png")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 版本历史
|
||
|
||
| 版本 | 日期 | 说明 |
|
||
|------|------|------|
|
||
| v1.0.0 | 2026-06-30 | 初始版本,支持三种图片输入方式,完整图片处理功能 |
|
||
|
||
---
|
||
|
||
## 许可证
|
||
|
||
MIT License
|