Files
wwjcloud/src/common/libraries/sharp/sharp.service.ts
wanwu 2285206b3f feat: WWJCloud 企业级全栈框架 v0.3.5 完整更新
🚀 核心更新:
-  完善 NestJS 企业级架构设计
-  优化配置中心和基础设施层
-  增强第三方服务集成能力
-  完善多租户架构支持
- 🎯 对标 Java Spring Boot 和 PHP ThinkPHP

📦 新增文件:
- wwjcloud-nest 完整框架结构
- Docker 容器化配置
- 管理后台界面
- 数据库迁移脚本

🔑 Key: ebb38b43ec39f355f071294fd1cf9c42
2025-10-13 01:27:37 +08:00

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}`;
}
}