@jackiemacklein/nettz-utils
Version:
Serviços de imagem, e-mail, códigos de barras, utilitários numéricos e componentes React para apps Node.js com TypeScript
118 lines (117 loc) • 3.93 kB
JavaScript
;
/**
* @author Jackiê Macklein
* @company Onside tecnologia/Nettz
* @copyright Todos direitos reservados.
* @description Serviço para processamento de imagens
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sharp_1 = __importDefault(require("sharp"));
class ImageService {
/**
* Redimensiona uma imagem mantendo a proporção
* @param buffer Buffer da imagem
* @param maxWidth Largura máxima
* @param maxHeight Altura máxima
*/
async resize(buffer, maxWidth, maxHeight) {
return (0, sharp_1.default)(buffer)
.resize(maxWidth, maxHeight, {
fit: "inside",
withoutEnlargement: true,
})
.toBuffer();
}
/**
* Recorta uma imagem em um formato específico
* @param buffer Buffer da imagem
* @param width Largura desejada
* @param height Altura desejada
*/
async crop(buffer, width, height) {
return (0, sharp_1.default)(buffer)
.resize(width, height, {
fit: "cover",
position: "center",
})
.toBuffer();
}
/**
* Comprime uma imagem para reduzir seu tamanho
* @param buffer Buffer da imagem
* @param quality Qualidade da compressão (1-100)
*/
async compress(buffer, quality = 80) {
return (0, sharp_1.default)(buffer).jpeg({ quality }).toBuffer();
}
/**
* Converte uma imagem para um formato específico
* @param buffer Buffer da imagem
* @param format Formato desejado ('jpeg', 'png', 'webp')
*/
async convert(buffer, format) {
return (0, sharp_1.default)(buffer)[format]().toBuffer();
}
/**
* Adiciona uma marca d'água a uma imagem
* @param imageBuffer Buffer da imagem principal
* @param watermarkBuffer Buffer da marca d'água
*/
async addWatermark(imageBuffer, watermarkBuffer) {
return (0, sharp_1.default)(imageBuffer)
.composite([
{
input: watermarkBuffer,
gravity: "southeast",
},
])
.toBuffer();
}
/**
* Converte um buffer de imagem para base64
* @param buffer Buffer da imagem
* @param format Formato da imagem para o cabeçalho do base64
*/
async toBase64(buffer, format = "jpeg") {
const mimeTypes = {
jpeg: "image/jpeg",
png: "image/png",
webp: "image/webp",
};
const base64 = buffer.toString("base64");
return `data:${mimeTypes[format]};base64,${base64}`;
}
/**
* Converte uma string base64 para buffer
* @param base64 String base64 da imagem
*/
async fromBase64(base64) {
// Remove o cabeçalho do data URL se existir
const base64Data = base64.replace(/^data:image\/\w+;base64,/, "");
return Buffer.from(base64Data, "base64");
}
/**
* Processa uma imagem e retorna em base64
* @param buffer Buffer da imagem
* @param options Opções de processamento
*/
async processAndReturnBase64(buffer, options = {}) {
const { maxWidth, maxHeight, quality = 80, format = "jpeg" } = options;
let processedBuffer = buffer;
// Aplica redimensionamento se especificado
if (maxWidth || maxHeight) {
processedBuffer = await this.resize(processedBuffer, maxWidth || 0, maxHeight || 0);
}
// Comprime e converte para o formato especificado
processedBuffer = await (0, sharp_1.default)(processedBuffer)[format]({
quality,
})
.toBuffer();
// Converte para base64
return this.toBase64(processedBuffer, format);
}
}
exports.default = ImageService;