Table des matières
总结
Maison interface Web js tutoriel Une brève analyse de la façon d'ajouter des filigranes translucides aux images à l'aide de nodejs (explication détaillée de la méthode)

Une brève analyse de la façon d'ajouter des filigranes translucides aux images à l'aide de nodejs (explication détaillée de la méthode)

Feb 22, 2022 pm 07:38 PM
nodejs 图片水印

Comment ajouter un filigrane aux images à l'aide de nodejs ? L'article suivant utilise des exemples pour présenter comment utiliser node pour ajouter des filigranes translucides pleine page aux images. J'espère que cela sera utile à tout le monde !

Une brève analyse de la façon d'ajouter des filigranes translucides aux images à l'aide de nodejs (explication détaillée de la méthode)

En tant que fonction d'exportation des projets mid-end et back-end, nous sommes généralement tenus de disposer de capacités de traçabilité des exportations.

Lorsque les données exportées sont sous forme d'images, des filigranes sont généralement ajoutés aux images pour atteindre cet objectif.

DEMO

Alors, comment ajouter un filigrane pouvant être utilisé comme identité de l'exportateur avant d'exporter une photo ? Jetons d'abord un coup d'œil au produit fini :

Une brève analyse de la façon dajouter des filigranes translucides aux images à laide de nodejs (explication détaillée de la méthode)

L'image originale ci-dessus est une image que j'ai trouvée au hasard en ligne. L'effet après l'ajout du filigrane est celui indiqué sur l'image.

Décomposition des exigences commerciales

Ici, nous devons considérer trois points clés de cette exigence dans ce scénario commercial :

  • Le filigrane doit couvrir toute l'image
  • Le texte du filigrane doit être translucide pour garantir l'original image La lisibilité
  • Le texte du filigrane doit être clair et lisible

Sélection

Comme je suis responsable de la mise en œuvre des exigences ci-dessus sur un serveur node.js, il existe de nombreuses options, telles que directement en utilisant c lib imagemagick ou diverses bibliothèques de filigranes de nœuds qui ont été packagées par d'autres. Dans cet article, nous choisirons d'utiliser un wrapper de la bibliothèque Jimp.

La page github officielle de la bibliothèque Jimp se décrit comme suit :

Une bibliothèque de traitement d'images pour Node écrite entièrement en JavaScript, avec zéro dépendance native.

Et fournit de nombreuses API pour exploiter les images

  • blit - Blit une image sur une autre.
  • blur - Brouiller rapidement une image.
  • color - Diverses méthodes de manipulation des couleurs.
  • contain - Contenir une image dans une hauteur et une largeur.
  • cover - Redimensionnez l'image de manière à ce que la largeur et la hauteur données conservent le rapport hauteur/largeur.
  • flip
  • - Retourner une image le long de son axe x ou y.
  • gaussian
  • - Flou hardcore.
  • invert
  • - Inverser les couleurs d'une image
  • mask
  • - Masquer une image avec une autre.
  • normaliser
  • - Normaliser les couleurs d'une image
  • imprimer
  • - Imprimer du texte sur une image
  • redimensionner
  • - Redimensionner une image.
  • rotate
  • - Faire pivoter une image.
  • scale
  • - Redimensionne uniformément l'image d'un factor.
  • input 参数设计:
  • url: 原图片的存储地址(对于Jimp来说,可以是远程地址,也可以是本地地址)
  • textSize: 需添加的水印文字大小
  • opacity:透明度
text:需要添加的水印文字

dstPath:添加水印之后的输出图片地址,地址为脚本执行目录的相对路径

rotate:水印文字的旋转角度colWidth:因为可旋转的水印文字是作为一张图印原图上的,因此这里定义一下水印图的宽度, 默认为300像素

rowHeight:理由同上,水印图片的高度,默认为为50像素。(PS:这里的水印图片尺寸可以大致理解为水印文字的间隔)

    因此在该模块的coverTextWatermark函数中Description du produit度,并写到原图片上,因此我们需要根据水印文本生成新的图片二进制流,并将下面是生成水印图片的函数定义:
  • 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    /**

     * @param {String} mainImage - Path of the image to be watermarked

     * @param {Object} options

     * @param {String} options.text     - String to be watermarked

     * @param {Number} options.textSize - Text size ranging from 1 to 8

     * @param {String} options.dstPath  - Destination path where image is to be exported

     * @param {Number} options.rotate   - Text rotate ranging from 1 to 360

     * @param {Number} options.colWidth - Text watermark column width

     * @param {Number} options.rowHeight- Text watermark row height

     */

     

    module.exports.coverTextWatermark = async (mainImage, options) => {

      try {

        options = checkOptions(options);

        const main = await Jimp.read(mainImage);

        const watermark = await textWatermark(options.text, options);

        const positionList = calculatePositionList(main, watermark)

        for (let i =0; i < positionList.length; i++) {

          const coords = positionList[i]

          main.composite(watermark,

            coords[0], coords[1] );

        }

        main.quality(100).write(options.dstPath);

        return {

          destinationPath: options.dstPath,

          imageHeight: main.getHeight(),

          imageWidth: main.getWidth(),

        };

      } catch (err) {

        throw err;

      }

    }

    Copier après la connexion
  • calculatePositionList
  • 到目前为止原图有了,水印图片也有了,如果想达到铺满原图的水印效果,我们还需要计算出水印图片应该在哪些坐标上画在原图上,才能达成水印铺满原图的目的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    const calculatePositionList = (mainImage, watermarkImg) => {

      const width = mainImage.getWidth()

      const height = mainImage.getHeight()

      const stepWidth = watermarkImg.getWidth()

      const stepHeight = watermarkImg.getHeight()

      let ret = []

      for(let i=0; i < width; i=i+stepWidth) {

        for (let j = 0; j < height; j=j+stepHeight) {

          ret.push([i, j])

        }

      }

      return ret

    }

    Copier après la connexion

    如上代码所示,我们使用一个二维数组记录所有水印图片需出现在原图上的坐标列表。

    总结

    至此,关于使用Jimp为图片添加文字水印的所有主要功能就都讲解到了。

    github地址:https://github.com/swearer23/jimp-fullpage-watermark

    npm:npm i jimp-fullpage-watermark

    Inspiration 致谢

    https://github.com/sushantpaudel/jimp-watermark

    https://github.com/luthraG/image-watermark

    https://medium.com/@rossbulat/image-processing-in-nodejs-with-jimp-174f39336153

    示例代码:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    var watermark = require(&#39;jimp-fullpage-watermark&#39;);

     

    watermark.coverTextWatermark(&#39;./img/main.jpg&#39;, {

      textSize: 5,

      opacity: 0.5,

      rotation: 45,

      text: &#39;watermark test&#39;,

      colWidth: 300,

      rowHeight: 50

    }).then(data => {

        console.log(data);

    }).catch(err => {

        console.log(err);

    });

    Copier après la connexion

    更多node相关知识,请访问:nodejs 教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre nodejs et tomcat La différence entre nodejs et tomcat Apr 21, 2024 am 04:16 AM

La différence entre nodejs et tomcat

La différence entre nodejs et vuejs La différence entre nodejs et vuejs Apr 21, 2024 am 04:17 AM

La différence entre nodejs et vuejs

Nodejs est-il un framework backend ? Nodejs est-il un framework backend ? Apr 21, 2024 am 05:09 AM

Nodejs est-il un framework backend ?

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ? Apr 21, 2024 am 05:18 AM

Quelle est la différence entre les fichiers npm et npm.cmd dans le répertoire d'installation de nodejs ?

Nodejs est-il un langage de développement back-end ? Nodejs est-il un langage de développement back-end ? Apr 21, 2024 am 05:09 AM

Nodejs est-il un langage de développement back-end ?

Quelles sont les variables globales dans nodejs Quelles sont les variables globales dans nodejs Apr 21, 2024 am 04:54 AM

Quelles sont les variables globales dans nodejs

Y a-t-il une grande différence entre nodejs et java ? Y a-t-il une grande différence entre nodejs et java ? Apr 21, 2024 am 06:12 AM

Y a-t-il une grande différence entre nodejs et java ?

Lequel choisir entre nodejs et java ? Lequel choisir entre nodejs et java ? Apr 21, 2024 am 04:40 AM

Lequel choisir entre nodejs et java ?

See all articles