daShangDao_utils/README.md
Cai1Cai1 a92f8e2c10 feat: 初始版本 v1.0.0
- 新增 imglib 包,支持 FilePath/URL/Base64 三种图片输入方式
- 纯白占比检测、白底居中合成、等比缩放、去白边、裁切
- 二维码生成与识别、条形码生成(Code128/EAN13/Code39)
- 中文文字图片、书籍信息水印、通用水印叠加
- 输出辅助:EncodeToBytes/EncodeToBase64/SaveToFile/SaveJPEG/SavePNG
- 字体缓存,避免重复加载
- 完整测试覆盖(23个测试用例)
2026-06-30 11:56:28 +08:00

240 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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