Board logo

标题: 30元求助,挑选一部分图片加水印并备份原图 [打印本页]

作者: 464700366    时间: 2019-12-9 01:18     标题: 30元求助,挑选一部分图片加水印并备份原图

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

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

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

图片添加水印.bat
默认添加到图片中间了,水印位置共9种选择.
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. # 图片文件夹列表
  10. $picDirs = "D:\image\300","D:\image"
  11. # 水印图片路径
  12. $picWatermark = "D:\image\logo.png"
  13. # 水印水平位置: Left,Center,Right
  14. $HorizontalPosition = "Center"
  15. # 水印垂直位置: Top,Center,Bottom
  16. $VerticalPosition = "Center"
  17. function Get-PictureInfo {
  18.   [CmdletBinding(DefaultParameterSetName = "PathSet")]
  19.   param (
  20.     [Parameter(Mandatory = $true,
  21.       Position = 0,
  22.       ParameterSetName = "PathSet",
  23.       ValueFromPipeline = $true,
  24.       ValueFromPipelineByPropertyName = $true,
  25.       HelpMessage = "Path to one or more locations.")]
  26.     [ValidateNotNullOrEmpty()]
  27.     [string[]]
  28.     $Path,
  29.     [Parameter(Mandatory = $false,
  30.       ParameterSetName = "LiteralPathSet",
  31.       ValueFromPipelineByPropertyName = $true,
  32.       HelpMessage = "Literal path to one or more locations.")]
  33.     [ValidateNotNullOrEmpty()]
  34.     [string[]]
  35.     $LiteralPath
  36.   )
  37.   
  38.   begin {
  39.     if ($PSBoundParameters.ContainsKey("Debug")) {
  40.       $DebugPreference = "Continue"
  41.     }
  42.    
  43.   }
  44.   
  45.   process {
  46.     $pathToProcess = if ($PSCmdlet.ParameterSetName -eq 'PathSet') {
  47.       Convert-Path -Path $Path
  48.     } else {
  49.       Convert-Path -LiteralPath $LiteralPath
  50.     }
  51.     foreach ($filePath in $pathToProcess) {
  52.       if (Test-Path -LiteralPath $filePath -PathType Container) {
  53.         continue
  54.       }
  55.       try {
  56.         $bitmap = New-Object "System.Drawing.Bitmap" -ArgumentList $filePath
  57.       } catch {
  58.         $filePath, $Error[0] | Out-String | Write-Host -ForegroundColor Red
  59.         continue
  60.       }
  61.       New-Object -TypeName psobject -Property @{
  62.         FilePath    = $filepath
  63.         Width       = $bitmap.Width
  64.         Height      = $bitmap.Height
  65.         PixelFormat = $bitmap.PixelFormat
  66.       }
  67.       $bitmap.Dispose()
  68.     }
  69.   }
  70. }
  71. function Add-WaterMark {
  72.   param (
  73.     [string]$ImageSource,
  74.     [string]$ImageWatermark,
  75.     [ValidateSet('Left', 'Center', 'Right')]
  76.     [string]$HorizontalPosition = 'Center',
  77.     [ValidateSet('Top', 'Center', 'Bottom')]
  78.     [string]$VerticalPosition = 'Center'
  79.   )
  80.   $tmppic = [System.IO.Path]::GetTempFileName() + [System.IO.Path]::GetExtension($ImageSource)
  81.   try {
  82.     $image = [System.Drawing.Image]::FromFile($ImageSource)
  83.     $watermark = [System.Drawing.Image]::FromFile($ImageWatermark)
  84.     $gfx = [System.Drawing.Graphics]::FromImage($image)
  85.     $waterbrush = New-Object System.Drawing.TextureBrush -ArgumentList $watermark
  86.     switch ($HorizontalPosition) {
  87.       'Left' { [int]$x = 0 }
  88.       'Center' { [int]$x = [math]::Floor(($image.Width - $watermark.Width) / 2) }
  89.       'Right' { [int]$x = $image.Width - $watermark.Width }
  90.     }
  91.     switch ($VerticalPosition) {
  92.       'Top' { [int]$y = 0 }
  93.       'Center' { [int]$y = [math]::Floor(($image.Height - $watermark.Height) / 2) }
  94.       'Bottom' { [int]$y = $image.Height - $watermark.Height }
  95.     }
  96.    
  97.     $waterbrush.TranslateTransform($x, $y)
  98.     $gfx.FillRectangle($waterbrush, (New-Object System.Drawing.Rectangle -ArgumentList @((New-Object System.Drawing.Point -ArgumentList $x, $y), $watermark.Size)))
  99.     $image.Save($tmppic)
  100.   } finally {
  101.     if ($image) {
  102.       $image.Dispose()
  103.     }
  104.     if ($watermark) {
  105.       $watermark.Dispose()
  106.     }
  107.     if ($gfx) {
  108.       $gfx.Dispose()
  109.     }
  110.     if ($waterbrush) {
  111.       $waterbrush.Dispose()
  112.     }
  113.     Move-Item -LiteralPath $tmppic -Destination $ImageSource -Force
  114.   }
  115. }
  116. Add-Type -AssemblyName System.Drawing
  117. foreach ($picDir in $picDirs) {
  118.   $backupdir = "$picDir\备份"
  119.   if (!(Test-Path -LiteralPath $backupdir)) {
  120.     New-Item -Path $backupdir -ItemType Directory
  121.   }
  122.   Get-Item -Path $picDir\* -Include *.png, *.jpg -OutBuffer 10 | Get-PictureInfo | Where-Object { $_.Width -ge 1000 } | `
  123.     Sort-Object -Property Width, Height -Descending | Select-Object -ExpandProperty FilePath -First 2 | ForEach-Object {
  124.     Copy-Item -LiteralPath $_ -Destination $backupdir -Verbose
  125.     '添加水印: ' + $_ | Out-Host
  126.     Add-WaterMark -ImageSource $_ -ImageWatermark $picWatermark -HorizontalPosition $HorizontalPosition -VerticalPosition $VerticalPosition
  127.   }
  128. }
复制代码

作者: zaqmlp    时间: 2019-12-9 10:34

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

http://bcn.bathome.net/tool/ImageMagick,6.9.2-6/convert.exe 下载该命令并跟bat和多个文件夹放一起
  1. /*&cls
  2. @echo off
  3. mode con lines=3000
  4. set info=互助互利,支付宝扫码头像,感谢打赏
  5. rem 有问题,可加QQ956535081及时沟通
  6. title %info%
  7. set "rootpath=%~dp0"
  8. set "rootpath=%rootpath:~,-1%"
  9. cd /d "%rootpath%"
  10. rem 备份文件夹
  11. set "newfolder=.\备份"
  12. rem 数量
  13. set count=5
  14. rem 最小宽度
  15. set width=1000
  16. rem 水印文件
  17. set "logofile=.\xxx.png"
  18. rem 水印位置,1为左上角,2为右上角,3为左下角,4为右下角
  19. set direction=2
  20. if not exist "convert.exe" (echo;"convert.exe" not found&goto end)
  21. if not exist "%logofile%" (echo;"%logofile%" not found&goto end)
  22. set gravity=northwest
  23. if "%direction%" equ "2" set gravity=northeast
  24. if "%direction%" equ "3" set gravity=southwest
  25. if "%direction%" equ "4" set gravity=southeast
  26. 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 (
  27.     echo;".%%a%%b"
  28.     if not exist "%newfolder%%%a" md "%newfolder%%%a"
  29.     copy /y ".%%a%%b" "%newfolder%%%a"
  30.     "convert.exe" ".%%a%%b" "%logofile%" -gravity %gravity% -geometry +5+5 -composite ".%%a%%b"
  31. )
  32. :end
  33. echo;%info%
  34. pause
  35. exit
  36. */
  37. var sa=new ActiveXObject('Shell.Application');
  38. var fso=new ActiveXObject('Scripting.FileSystemObject');
  39. var w=0,objFolder=sa.NameSpace(0);
  40. for(var i=0; i<350; i++){if(objFolder.GetDetailsOf(null, i) == '尺寸'){w=i;break;}}
  41. if(w==0){WSH.echo('failed to identify');WSH.Quit();}
  42. var files={};
  43. while(!WSH.StdIn.AtEndOfStream){
  44.     var line=WSH.StdIn.ReadLine();
  45.     var file=fso.GetFile(line);
  46.     var fpath=file.ParentFolder.Path;
  47.     if(files[fpath]==undefined){
  48.         files[fpath]=[];
  49.     }
  50.     var fwidth=getwidth(file);var fsize=file.Size;
  51.     if(Number(fwidth) >= Number(WSH.Arguments(1))){
  52.         files[fpath].push(file.Name+'|'+fsize.toString());
  53.     }
  54. }
  55. for(var it in files){
  56.     if(files[it].length >0){
  57.         files[it].sort(function(a,b){
  58.             return Number(b.split('|')[1]) - Number(a.split('|')[1]);
  59.         });
  60.         var n=0;
  61.         for(var i=0;i<files[it].length;i++){
  62.             WSH.echo(it.replace(WSH.Arguments(2), '')+'\\|'+files[it][i].split('|')[0]);
  63.             n++;
  64.             if(n >= Number(WSH.Arguments(0))){break;}
  65.         }
  66.     }
  67. }
  68. function getwidth(f){
  69.     var fw=0;
  70.     var objFolder=sa.Namespace(f.ParentFolder.Path);
  71.     var objItem=objFolder.ParseName(f.Name);
  72.     fw=objFolder.GetDetailsOf(objItem, w).match(/\d+/)[0];
  73.     return fw;
  74. }
复制代码

作者: WHY    时间: 2019-12-9 15:37

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

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





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2