Изменение размера и добавление водяного знака на изображения с помощью Nodejs и sharp-multer


Мотивация :

Всякий раз, когда мы начинаем работать с изображениями, на первое место выходит изменение размера, и часто нам нужно поставить водяной знак. В прошлом посте мы узнали, как настроить базовое изменение размера и оптимизацию изображений с помощью sharp-multer. Здесь мы собираемся добавить расширенное изменение размера и добавление водяного знака ко всем загруженным изображениям.

Предварительные условия:

Пожалуйста, прочитайте часть 1 этой серии здесь.

Установка и настройка:

В последней части мы установили простое приложение NodeJS с этими файлами, содержащими следующий код

Server.js

const express = require("express");
const path = require("path");
const multer = require("multer");
const SharpMulter = require("sharp-multer");
const app = express();

const storage = SharpMulter({
  destination: (req, file, callback) => callback(null, "images"),
  imageOptions: {
    fileFormat: "png",
    quality: 80,
    resize: { width: 500, height: 500 },
  }
});
const upload = multer({ storage });

app.post("/upload", upload.single("avatar"), async (req, res) => {
  console.log(req.file);
  return res.json("File Uploaded Successfully!");
});
app.get("/", function (req, res) {
  res.sendFile(path.join(__dirname, "/index.html"));
});

app.listen(3000, () => {
  console.log(`Server is running on port ${3000}`);
});
Вход в полноэкранный режим Выход из полноэкранного режима

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>File Upload</title>
</head>
<body>
    <div class="container">
        <h1>File Upload</h1>
<!--Create a form to send the file to a route  "upload"-->
<!--Set the request method to POST-->
<!--Set the encytype to "multipart/form-data" in order to send files and not just text-->
        <form action="/upload" method="POST" enctype="multipart/form-data">
            <div class="file-field input-field">
              <div class="btn grey">
                <input type="file" name="avatar">
              </div>
            </div>
            <button class="btn" type="submit">Submit</button>
          </form>
    </div>
</body>
</html>
Войти в полноэкранный режим Выход из полноэкранного режима

У нас есть базовое изменение размера и оптимизация, но теперь с sharp-multer 0.2.1 у нас есть несколько дополнительных опций изменения размера, которые мы можем определить, какой режим изменения размера использовать для изображений

ResizeMode

resize.resizeMode

чтобы использовать его, нам нужно указать ключ resizeMode в объекте imageOptions resize ex :


imageOptions: {
    fileFormat: "png",
    quality: 80,
    resize: { width: 500, height: 500, resizeMode: "outside" },
  }
Войти в полноэкранный режим Выход из полноэкранного режима

Добавление водяного знака

С новым sharp-multer добавить водяной знак довольно просто, достаточно указать путь к входному изображению и место, на которое мы хотим поместить водяной знак.
В настоящее время мы можем разместить водяной знак в таких местах: "center", "top-left", "top-right", "bottom-left", "bottom-right", а также непрозрачность водяного знака может быть определена путем передачи opacity prop в watermarkOptions, поэтому для добавления водяного знака наша конфигурация хранилища будет выглядеть следующим образом

const storage = SharpMulter({
  destination: (req, file, callback) => callback(null, "images"),
  imageOptions: {
    fileFormat: "png",
    quality: 80,
    resize: { width: 500, height: 500, resizeMode: "outside" },
  },
  watermarkOptions: {
    input: "./images/logo.png", // watermark image location
    location: "top-right",
    opacity:50 // optional 
  },
});

Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете найти весь код в этом репозитории, попробуйте его и получите удовольствие, будьте здоровы.

Оцените статью
devanswers.ru
Добавить комментарий