返回列表 发帖

30元求助,挑选一部分图片加水印并备份原图

有多个文件夹,每个文件夹都有一些图片,我需要给其中一小部分图片加上水印并按目录备份这些加水印的原图

图片格式是jpg和png的,需要吧每个文件夹里的图片按大小排列,挑选出来文件最大的5张图 并且要确保选出来的图宽度必须大于1000像素,【目的是像素太低的图加水印影响美观】
如果符合要求的不够五张就有几张算几张
然后在当前文件夹新建个[备份]文件夹,吧这些符合要求的图按目录复制到备份文件夹,方便日后还原,
接下来就是给符合要求的图加上水印并覆盖原图。
q2089 06626

本帖最后由 flashercs 于 2019-12-9 11:38 编辑

图片添加水印.bat
默认添加到图片中间了,水印位置共9种选择.
<#*,:&cls
@echo off
pushd "%~dp0"
powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
popd
pause
exit /b
#>
# 图片文件夹列表
$picDirs = "D:\image\300","D:\image"
# 水印图片路径
$picWatermark = "D:\image\logo.png"
# 水印水平位置: Left,Center,Right
$HorizontalPosition = "Center"
# 水印垂直位置: Top,Center,Bottom
$VerticalPosition = "Center"
function Get-PictureInfo {
  [CmdletBinding(DefaultParameterSetName = "PathSet")]
  param (
    [Parameter(Mandatory = $true,
      Position = 0,
      ParameterSetName = "PathSet",
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true,
      HelpMessage = "Path to one or more locations.")]
    [ValidateNotNullOrEmpty()]
    [string[]]
    $Path,
    [Parameter(Mandatory = $false,
      ParameterSetName = "LiteralPathSet",
      ValueFromPipelineByPropertyName = $true,
      HelpMessage = "Literal path to one or more locations.")]
    [ValidateNotNullOrEmpty()]
    [string[]]
    $LiteralPath
  )
  
  begin {
    if ($PSBoundParameters.ContainsKey("Debug")) {
      $DebugPreference = "Continue"
    }
   
  }
  
  process {
    $pathToProcess = if ($PSCmdlet.ParameterSetName -eq 'PathSet') {
      Convert-Path -Path $Path
    } else {
      Convert-Path -LiteralPath $LiteralPath
    }
    foreach ($filePath in $pathToProcess) {
      if (Test-Path -LiteralPath $filePath -PathType Container) {
        continue
      }
      try {
        $bitmap = New-Object "System.Drawing.Bitmap" -ArgumentList $filePath
      } catch {
        $filePath, $Error[0] | Out-String | Write-Host -ForegroundColor Red
        continue
      }
      New-Object -TypeName psobject -Property @{
        FilePath    = $filepath
        Width       = $bitmap.Width
        Height      = $bitmap.Height
        PixelFormat = $bitmap.PixelFormat
      }
      $bitmap.Dispose()
    }
  }
}
function Add-WaterMark {
  param (
    [string]$ImageSource,
    [string]$ImageWatermark,
    [ValidateSet('Left', 'Center', 'Right')]
    [string]$HorizontalPosition = 'Center',
    [ValidateSet('Top', 'Center', 'Bottom')]
    [string]$VerticalPosition = 'Center'
  )
  $tmppic = [System.IO.Path]::GetTempFileName() + [System.IO.Path]::GetExtension($ImageSource)
  try {
    $image = [System.Drawing.Image]::FromFile($ImageSource)
    $watermark = [System.Drawing.Image]::FromFile($ImageWatermark)
    $gfx = [System.Drawing.Graphics]::FromImage($image)
    $waterbrush = New-Object System.Drawing.TextureBrush -ArgumentList $watermark
    switch ($HorizontalPosition) {
      'Left' { [int]$x = 0 }
      'Center' { [int]$x = [math]::Floor(($image.Width - $watermark.Width) / 2) }
      'Right' { [int]$x = $image.Width - $watermark.Width }
    }
    switch ($VerticalPosition) {
      'Top' { [int]$y = 0 }
      'Center' { [int]$y = [math]::Floor(($image.Height - $watermark.Height) / 2) }
      'Bottom' { [int]$y = $image.Height - $watermark.Height }
    }
   
    $waterbrush.TranslateTransform($x, $y)
    $gfx.FillRectangle($waterbrush, (New-Object System.Drawing.Rectangle -ArgumentList @((New-Object System.Drawing.Point -ArgumentList $x, $y), $watermark.Size)))
    $image.Save($tmppic)
  } finally {
    if ($image) {
      $image.Dispose()
    }
    if ($watermark) {
      $watermark.Dispose()
    }
    if ($gfx) {
      $gfx.Dispose()
    }
    if ($waterbrush) {
      $waterbrush.Dispose()
    }
    Move-Item -LiteralPath $tmppic -Destination $ImageSource -Force
  }
}
Add-Type -AssemblyName System.Drawing
foreach ($picDir in $picDirs) {
  $backupdir = "$picDir\备份"
  if (!(Test-Path -LiteralPath $backupdir)) {
    New-Item -Path $backupdir -ItemType Directory
  }
  Get-Item -Path $picDir\* -Include *.png, *.jpg -OutBuffer 10 | Get-PictureInfo | Where-Object { $_.Width -ge 1000 } | `
    Sort-Object -Property Width, Height -Descending | Select-Object -ExpandProperty FilePath -First 2 | ForEach-Object {
    Copy-Item -LiteralPath $_ -Destination $backupdir -Verbose
    '添加水印: ' + $_ | Out-Host
    Add-WaterMark -ImageSource $_ -ImageWatermark $picWatermark -HorizontalPosition $HorizontalPosition -VerticalPosition $VerticalPosition
  }
}COPY
微信:flashercs
QQ:49908356

TOP

本帖最后由 zaqmlp 于 2019-12-9 18:27 编辑

http://bcn.bathome.net/tool/ImageMagick,6.9.2-6/convert.exe 下载该命令并跟bat和多个文件夹放一起
/*&cls
@echo off
mode con lines=3000
set info=互助互利,支付宝扫码头像,感谢打赏
rem 有问题,可加QQ956535081及时沟通
title %info%
set "rootpath=%~dp0"
set "rootpath=%rootpath:~,-1%"
cd /d "%rootpath%"
rem 备份文件夹
set "newfolder=.\备份"
rem 数量
set count=5
rem 最小宽度
set width=1000
rem 水印文件
set "logofile=.\xxx.png"
rem 水印位置,1为左上角,2为右上角,3为左下角,4为右下角
set direction=2
if not exist "convert.exe" (echo;"convert.exe" not found&goto end)
if not exist "%logofile%" (echo;"%logofile%" not found&goto end)
set gravity=northwest
if "%direction%" equ "2" set gravity=northeast
if "%direction%" equ "3" set gravity=southwest
if "%direction%" equ "4" set gravity=southeast
for /f "tokens=1* delims=|" %%a in ('dir /a-d/b/s *.jpg *.png 2^>nul^|cscript -nologo -e:jscript "%~f0" %count% %width% "%rootpath%"') do (
    echo;".%%a%%b"
    if not exist "%newfolder%%%a" md "%newfolder%%%a"
    copy /y ".%%a%%b" "%newfolder%%%a"
    "convert.exe" ".%%a%%b" "%logofile%" -gravity %gravity% -geometry +5+5 -composite ".%%a%%b"
)
:end
echo;%info%
pause
exit
*/
var sa=new ActiveXObject('Shell.Application');
var fso=new ActiveXObject('Scripting.FileSystemObject');
var w=0,objFolder=sa.NameSpace(0);
for(var i=0; i<350; i++){if(objFolder.GetDetailsOf(null, i) == '尺寸'){w=i;break;}}
if(w==0){WSH.echo('failed to identify');WSH.Quit();}
var files={};
while(!WSH.StdIn.AtEndOfStream){
    var line=WSH.StdIn.ReadLine();
    var file=fso.GetFile(line);
    var fpath=file.ParentFolder.Path;
    if(files[fpath]==undefined){
        files[fpath]=[];
    }
    var fwidth=getwidth(file);var fsize=file.Size;
    if(Number(fwidth) >= Number(WSH.Arguments(1))){
        files[fpath].push(file.Name+'|'+fsize.toString());
    }
}
for(var it in files){
    if(files[it].length >0){
        files[it].sort(function(a,b){
            return Number(b.split('|')[1]) - Number(a.split('|')[1]);
        });
        var n=0;
        for(var i=0;i<files[it].length;i++){
            WSH.echo(it.replace(WSH.Arguments(2), '')+'\\|'+files[it][i].split('|')[0]);
            n++;
            if(n >= Number(WSH.Arguments(0))){break;}
        }
    }
}
function getwidth(f){
    var fw=0;
    var objFolder=sa.Namespace(f.ParentFolder.Path);
    var objItem=objFolder.ParseName(f.Name);
    fw=objFolder.GetDetailsOf(objItem, w).match(/\d+/)[0];
    return fw;
}COPY
提供bat代写,为你省时省力省事,支付宝扫码头像支付
微信: unique2random

TOP

本帖最后由 WHY 于 2019-12-10 00:07 编辑

添加文字水印,添加位置:图片右下角
function Add-WaterMark([string]$strFile){
    $Text = (Get-Date).ToString('yyyy年MM月dd日 HH:mm:ss');                #水印文字:当前日期字符串
    [int]$FontSize = 20;                                                   #字体大小
    [int]$Margin = 1;                                                      #字边距
    [float]$Alpha = 0.4;                                                   #透明度:[0.1~1.0]
    $Color = [Drawing.Color]::FromArgb([int](256*$Alpha),255,255,255);     #水印颜色:白色
    $FontFamily = 'Arial';                                                 #字体名称:Arial
    $FontStyle = [Drawing.FontStyle]::Italic;                              #字体风格:斜体
    $image = [System.Drawing.Image]::FromFile($strFile);
    $graph = [System.Drawing.Graphics]::FromImage($image);
    $font  = New-Object System.Drawing.Font($FontFamily, $FontSize, $FontStyle);
    $textSize = $graph.MeasureString($Text, $font).ToPointF();
    $pointF = New-Object System.Drawing.PointF;
    $pointF.X = $image.Width - $Margin - $textSize.X;
    $pointF.Y = $image.Height - $Margin - $textSize.Y;
    $graph.DrawString($Text, $font, [System.Drawing.SolidBrush]$Color, $pointF);
    $image.Save($strFile + '.tmp');
    $graph.Dispose();
    $image.Dispose();
    mv -Literal ($strFile + '.tmp') -Dest $strFile -Force;
}
function Get-ImageInfo([string]$strFile){
    $image = [System.Drawing.Image]::FromFile($strFile);
    [int]$width = $image.Width;
    [int]$height = $image.Height;
    $image.Dispose();
    return @($width, $height);
}
$ImgFolder = 'D:\Picture';                #存放源图片的文件夹
$BakFolder = 'D:\Backup';                 #备份文件夹
[void][Reflection.Assembly]::LoadWithPartialName('System.Drawing');
$PSObj = dir -Literal $ImgFolder -Recurse | ?{$_ -is [IO.FileInfo] -and $_.Extension -match '^\.(jpg|png)$'} | forEach{
    $arr = Get-ImageInfo $_.FullName;     #图片宽度和高度
    if( $arr[0] -gt 1000 ){
        New-Object PSObject -Property @{ fp = $_.FullName; sz = $arr[0] * $arr[1] };
    }
}
$PSObj | sort sz -Desc | group {[IO.Path]::GetDirectoryName($_.fp)} | forEach{
    $newFolder = $BakFolder + $_.Name.SubString($ImgFolder.Length);
    if( ![IO.Directory]::Exists($newFolder) ){ $null = md $newFolder; }
    $_.Group | select -first 5 | forEach {
        copy -Literal $_.fp -Dest $newFolder -Force;
        Add-WaterMark $_.fp;              #添加水印
    }
}COPY

TOP

返回列表