jeudi 30 mai 2024

Watermark

Ce script permet d'inserer un watermark sur l'ensemble des images "jpg" et "png" d'un dossier.
1 - Copier le script dans le dossier d'image à traiter (ex: WaterMark.ps1).
2 - Créer le fichier "Watermark.png" à incruster.
3 - Dans le script, configurer l'option de position du watermark.
4 - Executer le script Powershell.

 
#######################################################################
#                                                                     #
# Watermark - V1.0.0                                                  #
#                                                                     #
# Par Olivier DELORME                                                 #
# Site https://powershell.sekki.fr                                    #
#                                                                     #
#######################################################################


#Assembly
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
[void][reflection.assembly]::LoadWithPartialName("System.Drawing")


#Choisir la position :
#"Remplir", "En haut a gauche", "En haut a droite",
#"En bas a gauche", "En bas a droite", "Au centre".
$wmOption = "Remplir"


#Chemin courant.
$global:curPath = ""
if ($psISE) { $global:curPath = Split-Path -parent $psISE.CurrentFile.Fullpath }
else        { $global:curPath = Split-Path $MyInvocation.MyCommand.Path }


#Image model :
#1 - Créer une image avec un fond transparant.
#2 - Pour rendre l'image transluside, règler le paramêtre "Opacité" dans votre éditeur d'image.
#3 - Sauvegarder l'image sous le nom "watermark.png" (au format PNG).
$Watermark = $global:curpath + "\watermark.png"

#Verifier si le fichier "watermark.png" est présent dans le dossier.
if (!(Test-Path -path ($global:curpath + "\watermark.png"))) { Write-Host "Le fichier ""watermark.png"" est absent !!!"; return }

#Créer le dossier de destination pour les images marquées.
if (!(Test-Path -path ($global:curpath + "\Marked"))) { $rtn = New-Item -Path ($global:curpath + "\Marked") -ItemType directory -Force }


#Initialisation graphique.
$waterMk = New-Object System.Drawing.Bitmap($Watermark)
$srcRect = New-Object System.Drawing.Rectangle(0, 0, $waterMk.Width, $waterMk.Height)


#Traitement des fichiers dans le dossier du script.
$files = Get-ChildItem -Path $global:curpath | where {$_ -match "((.jpg)|(.png))$"}

#Verifier si il y a des fichiers à traiter.
if ($files.count -le 1)
  {
    Write-Host "Le script doit être dans le même dossier que les images à traiter."
    return
  }

#Début du traitement.
foreach($file in $files)
 {
   if ($file -notmatch "WaterMark")
     {
       $image = New-Object System.Drawing.Bitmap($file.fullname)
       $graph = [System.Drawing.Graphics]::FromImage($image)
       Switch ($wmOption)
        {
                   "Remplir" {
                               $dstRect = New-Object System.Drawing.Rectangle(0, 0, $image.Width, $image.Height)
                               $graph.DrawImage($waterMk,$dstRect,$srcRect,2)
                             }
          "En haut a gauche" { $graph.DrawImage($waterMk,0,0,$srcRect,2) }
          "En haut a droite" {
                               $dstRect = New-Object System.Drawing.Rectangle(($image.Width-$waterMk.Width), 0, $waterMk.Width, $waterMk.Height)
                               $graph.DrawImage($waterMk,$dstRect,$srcRect,2)
                             }
          "En bas a gauche" {
                               $dstRect = New-Object System.Drawing.Rectangle(0, ($image.Height-$waterMk.Height), $waterMk.Width, $waterMk.Height)
                               $graph.DrawImage($waterMk,$dstRect,$srcRect,2)
                             }
          "En bas a droite" {
                               $dstRect = New-Object System.Drawing.Rectangle(($image.Width-$waterMk.Width), ($image.Height-$waterMk.Height), $waterMk.Width, $waterMk.Height)
                               $graph.DrawImage($waterMk,$dstRect,$srcRect,2)
                             }
                "Au centre" {
                               $cx = [int](($image.Width-$waterMk.Width)/2)
                               $cy = [int](($image.Height-$waterMk.Height)/2)
                               $dstRect = New-Object System.Drawing.Rectangle($cx, $cy, $waterMk.Width, $waterMk.Height)
                                $graph.DrawImage($waterMk,$dstRect,$srcRect,2)
                            }
        }
       $image.Save($global:curpath + "\Marked\" + $file)
       Write-Host "Le fichier ""$file"" a été sauvegardé dans le dossier ""Marked""."
       $graph.Dispose()
       $image.Dispose()
     }
 }

#Fin.
$waterMk.Dispose()


Exemple :