add media service
This commit is contained in:
48
internal/processor/image.go
Normal file
48
internal/processor/image.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package processor
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"image"
|
||||
"image/jpeg"
|
||||
_ "image/png" // Для поддержки декодирования PNG
|
||||
|
||||
"github.com/disintegration/imaging"
|
||||
)
|
||||
|
||||
// ProcessImage обрабатывает картинку в зависимости от типа загрузки
|
||||
// mode может быть: "avatar", "chat", "raw"
|
||||
func ProcessImage(fileBytes []byte, mode string) ([]byte, string, error) {
|
||||
// Если пользователь отправил "как файл" (без сжатия)
|
||||
if mode == "raw" {
|
||||
return fileBytes, "image/jpeg", nil // В идеале тут нужно определять mime-type по байтам
|
||||
}
|
||||
|
||||
// Декодируем исходную картинку
|
||||
img, _, err := image.Decode(bytes.NewReader(fileBytes))
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
var processedImg image.Image
|
||||
|
||||
switch mode {
|
||||
case "avatar":
|
||||
// Telegram делает аватарки квадратными (например, 500x500)
|
||||
processedImg = imaging.Fill(img, 500, 500, imaging.Center, imaging.Lanczos)
|
||||
case "chat":
|
||||
// Ограничиваем максимальный размер для чата (например, 1280px по большей стороне),
|
||||
// сохраняя пропорции
|
||||
processedImg = imaging.Fit(img, 1280, 1280, imaging.Lanczos)
|
||||
default:
|
||||
processedImg = img
|
||||
}
|
||||
|
||||
// Кодируем результат в сжатый JPEG (качество 80 - отличный баланс размера и качества)
|
||||
buf := new(bytes.Buffer)
|
||||
err = jpeg.Encode(buf, processedImg, &jpeg.Options{Quality: 80})
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
|
||||
return buf.Bytes(), "image/jpeg", nil
|
||||
}
|
||||
Reference in New Issue
Block a user