🚀 核心更新: - ✅ 完善 NestJS 企业级架构设计 - ✅ 优化配置中心和基础设施层 - ✅ 增强第三方服务集成能力 - ✅ 完善多租户架构支持 - 🎯 对标 Java Spring Boot 和 PHP ThinkPHP 📦 新增文件: - wwjcloud-nest 完整框架结构 - Docker 容器化配置 - 管理后台界面 - 数据库迁移脚本 🔑 Key: ebb38b43ec39f355f071294fd1cf9c42
162 lines
3.2 KiB
TypeScript
162 lines
3.2 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import sharp from 'sharp';
|
|
|
|
/**
|
|
* Sharp 图片处理服务
|
|
* 基于 NestJS 官方示例实现
|
|
* 参考: https://docs.nestjs.cn/fundamentals/dependency-injection
|
|
* 对应 Java: ImageUtils
|
|
*/
|
|
@Injectable()
|
|
export class SharpService {
|
|
/**
|
|
* 获取 sharp 实例
|
|
*/
|
|
getSharp() {
|
|
return sharp;
|
|
}
|
|
|
|
/**
|
|
* 调整图片大小
|
|
*/
|
|
async resize(
|
|
input: Buffer | string,
|
|
width: number,
|
|
height?: number,
|
|
options?: sharp.ResizeOptions,
|
|
): Promise<Buffer> {
|
|
return sharp(input).resize(width, height, options).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 生成缩略图
|
|
*/
|
|
async thumbnail(
|
|
input: Buffer | string,
|
|
size: number,
|
|
options?: sharp.ResizeOptions,
|
|
): Promise<Buffer> {
|
|
return sharp(input)
|
|
.resize(size, size, { ...options, fit: 'cover' })
|
|
.toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 压缩图片
|
|
*/
|
|
async compress(
|
|
input: Buffer | string,
|
|
quality: number = 80,
|
|
): Promise<Buffer> {
|
|
return sharp(input).jpeg({ quality }).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 转换图片格式
|
|
*/
|
|
async convert(
|
|
input: Buffer | string,
|
|
format: 'jpeg' | 'png' | 'webp' | 'gif' | 'tiff',
|
|
): Promise<Buffer> {
|
|
return sharp(input).toFormat(format).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 获取图片信息
|
|
*/
|
|
async metadata(input: Buffer | string): Promise<sharp.Metadata> {
|
|
return sharp(input).metadata();
|
|
}
|
|
|
|
/**
|
|
* 裁剪图片
|
|
*/
|
|
async crop(
|
|
input: Buffer | string,
|
|
left: number,
|
|
top: number,
|
|
width: number,
|
|
height: number,
|
|
): Promise<Buffer> {
|
|
return sharp(input).extract({ left, top, width, height }).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 旋转图片
|
|
*/
|
|
async rotate(input: Buffer | string, angle: number): Promise<Buffer> {
|
|
return sharp(input).rotate(angle).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 翻转图片
|
|
*/
|
|
async flip(input: Buffer | string): Promise<Buffer> {
|
|
return sharp(input).flip().toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 镜像图片
|
|
*/
|
|
async flop(input: Buffer | string): Promise<Buffer> {
|
|
return sharp(input).flop().toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 模糊图片
|
|
*/
|
|
async blur(input: Buffer | string, sigma: number): Promise<Buffer> {
|
|
return sharp(input).blur(sigma).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 锐化图片
|
|
*/
|
|
async sharpen(
|
|
input: Buffer | string,
|
|
sigma?: number,
|
|
flat?: number,
|
|
jagged?: number,
|
|
): Promise<Buffer> {
|
|
return sharp(input).sharpen(sigma, flat, jagged).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 调整亮度
|
|
*/
|
|
async modulate(
|
|
input: Buffer | string,
|
|
brightness: number = 1,
|
|
): Promise<Buffer> {
|
|
return sharp(input).modulate({ brightness }).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 调整对比度
|
|
*/
|
|
async linear(input: Buffer | string, a: number, b: number): Promise<Buffer> {
|
|
return sharp(input).linear(a, b).toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 添加水印
|
|
*/
|
|
async composite(
|
|
input: Buffer | string,
|
|
overlay: Buffer | string,
|
|
options?: sharp.OverlayOptions,
|
|
): Promise<Buffer> {
|
|
return sharp(input)
|
|
.composite([{ input: overlay, ...options }])
|
|
.toBuffer();
|
|
}
|
|
|
|
/**
|
|
* 生成图片哈希
|
|
*/
|
|
async hash(input: Buffer | string): Promise<string> {
|
|
const metadata = await sharp(input).metadata();
|
|
return `${metadata.width}x${metadata.height}-${metadata.format}`;
|
|
}
|
|
}
|