[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 批处理裁剪图片四边空白部分

怎么用批处理裁剪掉png格式的图片四边空白像素,如下图效果。
试过用nconvert.exe,但是图片白色时不行,不知怎么回事。
  1. nconvert -quiet -overwrite -autocrop 0 255 255 255 *.png
复制代码

本帖最后由 flashercs 于 2019-8-25 10:25 编辑

保存为 xxx.bat ,修改文件路径后使用
  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. $picsPath = "$PWD\[0-9].png"
  11. function Get-PictureCrop {
  12.   [CmdletBinding(DefaultParameterSetName = "PathSet")]
  13.   param (
  14.     [Parameter(Mandatory = $true,
  15.       Position = 0,
  16.       ParameterSetName = "PathSet",
  17.       ValueFromPipeline = $true,
  18.       ValueFromPipelineByPropertyName = $true,
  19.       HelpMessage = "Path to one or more locations.")]
  20.     [ValidateNotNullOrEmpty()]
  21.     [string[]]
  22.     $Path,
  23.     [Parameter(Mandatory = $false,
  24.       ParameterSetName = "LiteralPathSet",
  25.       ValueFromPipelineByPropertyName = $true,
  26.       HelpMessage = "Literal path to one or more locations.")]
  27.     [ValidateNotNullOrEmpty()]
  28.     [string[]]
  29.     $LiteralPath,
  30.     [switch]$OverWrite
  31.   )
  32.   
  33.   begin {
  34.     if ($PSBoundParameters.ContainsKey("Debug")) {
  35.       $DebugPreference = "Continue"
  36.     }
  37.     Add-Type -AssemblyName System.Drawing
  38.     function Get-TempFileName {
  39.       param (
  40.         [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
  41.         [string]$LiteralPath
  42.       )
  43.       $o = Get-Item -LiteralPath $LiteralPath | Select-Object -Property DirectoryName, BaseName, Extension
  44.       $n = 0
  45.       while (Join-Path -Path $o.DirectoryName -ChildPath "$($o.BaseName)_$n$($o.Extension)" -OutVariable fileName | Test-Path -LiteralPath { $_ }) {
  46.         ++$n
  47.       }
  48.       $fileName[0]
  49.     }
  50.   }
  51.   
  52.   process {
  53.     $pathToProcess = if ($PSCmdlet.ParameterSetName -eq 'PathSet') {
  54.       Convert-Path -Path $Path
  55.     }
  56.     else {
  57.       Convert-Path -LiteralPath $LiteralPath
  58.     }
  59.     # replace bytes from source to dest
  60.     foreach ($filePath in $pathToProcess) {
  61.       if (Test-Path -LiteralPath $filePath -PathType Container) {
  62.         continue
  63.       }
  64.       try {
  65.         $bitmap = New-Object "System.Drawing.Bitmap" -ArgumentList $filePath
  66.       }
  67.       catch {
  68.         $filePath, $Error[0] | Out-String | Write-Host -ForegroundColor Red
  69.         continue
  70.       }
  71.       Write-Host $filePath -ForegroundColor Green
  72.       $height = $bitmap.Height
  73.       $width = $bitmap.Width
  74.       # top
  75.       $top = $null
  76.       :outer
  77.       for ($y = 0; $y -lt $height; $y++) {
  78.         for ($x = 0; $x -lt $width; $x++) {
  79.           $color = $bitmap.GetPixel($x, $y)
  80.           if ($color.GetBrightness() -lt 0.5) {
  81.             $top = $y
  82.             break outer
  83.           }
  84.         }
  85.       }
  86.       if ($null -eq $top) {
  87.         $bitmap.Dispose()
  88.         continue
  89.       }
  90.       # right
  91.       :outer
  92.       for ($x = $width - 1; $x -ge 0; $x--) {
  93.         for ($y = $height - 1; $y -ge 0; $y--) {
  94.           $color = $bitmap.GetPixel($x, $y)
  95.           if ($color.GetBrightness() -lt 0.5) {
  96.             $right = $x
  97.             break outer
  98.           }
  99.         }
  100.       }
  101.       # bottom
  102.       :outer
  103.       for ($y = $height - 1; $y -ge 0; $y--) {
  104.         for ($x = $width - 1; $x -ge 0; $x--) {
  105.           $color = $bitmap.GetPixel($x, $y)
  106.           if ($color.GetBrightness() -lt 0.5) {
  107.             $bottom = $y
  108.             break outer
  109.           }
  110.         }
  111.       }
  112.       # left
  113.       :outer
  114.       for ($x = 0; $x -lt $width; $x++) {
  115.         for ($y = 0; $y -lt $height; $y++) {
  116.           $color = $bitmap.GetPixel($x, $y)
  117.           if ($color.GetBrightness() -lt 0.5) {
  118.             $left = $x
  119.             break outer
  120.           }
  121.         }
  122.       }
  123.       Write-Debug "$left $top $right $bottom"
  124.       if ($left -eq 0 -and $top -eq 0 -and $right -eq ($width - 1) -and $bottom -eq ($height - 1)) {
  125.         $bitmap.Dispose()
  126.         continue
  127.       }
  128.       # new pic
  129.       $bitmap2 = New-Object "System.Drawing.Bitmap" -ArgumentList ($right - $left + 1), ($bottom - $top + 1), $bitmap.PixelFormat
  130.       $bitmap2.SetResolution($bitmap.HorizontalResolution, $bitmap.VerticalResolution)
  131.       $bitmap2 | Format-List * | Out-String | Write-Debug
  132.       for ($x = $left; $x -le $right; $x++) {
  133.         for ($y = $top; $y -le $bottom; $y++) {
  134.           $bitmap2.SetPixel($x - $left, $y - $top, $bitmap.GetPixel($x, $y))
  135.         }
  136.       }
  137.       $imageFormat = $bitmap.RawFormat
  138.       $bitmap.Dispose()
  139.       if ($OverWrite) {
  140.         $bitmap2.Save($filePath, $imageFormat)
  141.       }
  142.       else {
  143.         $bitmap2.Save((Get-TempFileName $filePath), $imageFormat)
  144.       }
  145.       $bitmap2.Dispose()
  146.     }
  147.   }
  148.   
  149.   end {
  150.   }
  151. }
  152. # Get-PictureCrop -Path $picsPath
  153. # 添加参数 OverWrite 为覆盖源文件
  154. $picsPath | Get-PictureCrop -OverWrite
复制代码
微信:flashercs
QQ:49908356

TOP

回复 2# flashercs


    谢谢了,我自己又研究了一天,用ImageMagick实现了。
  1. set pic=%MyDocuments%\images\*.png
  2. ::裁剪掉四边空白像素
  3. for /f "delims=" %%a in ('dir /a-d/s/b %pic%') do ( tools\convert.exe %%a -quiet -trim %%a )
复制代码

TOP

回复 3# 505250350


    能否发下全部代码~!

TOP

回复 4# luckcsz


    3楼应该就是完整代码,你需要先安装 ImageMagick
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表