对于图像(PowerShell 2.0)

对于图像(PowerShell 2.0)

我知道我可以搜索文件(图片、视频)具有特定尺寸, 使用width:1920, height:1080

但是,如何在 Windows 7 中搜索具有 16:9 宽高比的文件?

答案1

Windows 7 资源管理器搜索无法实现这一点


不过,这里有一个依赖于 Windows 整体部件的替代方案

对于图像(PowerShell 2.0)

它从给定的根文件夹读取每个图像,用图像高度除以宽度,将结果与例如进行比较16/10,并在比率匹配时输出完整路径

Get-Childitem "D:\MyPictures" -include @("*.jpg","*.png") -recurse | Where {
    $img = New-Object System.Drawing.Bitmap $_.FullName

    if ($img.Width / $img.Height -eq 16/10 -or 
        $img.Height / $img.Width -eq 16/10) {
        Write-Host $_.FullName
        }           
  }

对于图像(PowerShell 2.0)- 改进了裁剪/非标准纵横比的版本

$folder      = "C:\Users\Public\Pictures\Sample Pictures"
$searchRatio = 4/3
$AllRatios   = (16/10),(16/9),(4/3),(5/4),(21/10),(21/9)
$filetypes   =  @("*.jpg","*.png","*.bmp")

Clear-Host
Get-Childitem $folder -include $filetypes -recurse | foreach {
    $img = New-Object System.Drawing.Bitmap $_.FullName        
    if ($img.Width -gt $img.Height){ $fileRatio = $img.Width / $img.Height }
    else {$fileRatio = $img.Height / $img.Width}

    $differences = $AllRatios | %{  [math]::abs($_ - $fileRatio) } 
    $bestmatch = $differences | measure -Minimum
    $index = [array]::IndexOf($differences, $bestmatch.minimum)
    $closestRatio = $($AllRatios[$index])

    if ($closestRatio -eq $searchRatio) {
        Write-Host $fileRatio `t`t $_.FullName        
        }           
  }

解释

  1. 假设你有一个文件夹,里面的图片大部分都是裁剪过的。所以它们没有标准的宽高比,比如 16:9。对于它们,这个脚本总是搜索最接近标准宽高比的匹配项。$AllRatios = (16/10),(16/9),(4/3),(5/4),(21/10),(21/9)如果你想的话,你可以在

  2. 其他 3 个变量应该是不言自明的。$folder是您要搜索的文件夹。$searchRatio是您要查找的纵横比,并$fileTypes定义您感兴趣的图片类型


对于视频(PowerShell 2.0 +ffprobe

$folder      = "D:\My Videos\*"
$ffprobe     = "D:\ffmpeg\ffprobe.exe"
$searchRatio = "13:7"
$filetypes   = @{"*.avi","*.mp4"}

Clear-Host
Get-ChildItem $folder -include $filetypes -recurse | foreach {
    $details = & $ffprobe -loglevel quiet -show_streams -print_format flat=h=0 $_.Fullname
    $fileratio = $details | Select-String '(?<=stream.0.display_aspect_ratio=")\d+:\d+' |
       Foreach {$_.Matches} | ForEach-Object {$_.Value}

    if ($fileratio -eq $searchRatio ) {
        Write-Host $fileratio `t`t $_.FullName
    }   
}  

解释

  1. 您可以利用ffmpeg 的ffprobe 从视频中检索所有信息

    命令

    ffprobe -loglevel quiet -show_streams -print_format flat=h=0 input.mp4
    

    示例输出

    stream.0.index=0
    stream.0.codec_name="mpeg4"
    stream.0.codec_long_name="MPEG-4 part 2"
    stream.0.profile="Advanced Simple Profile"
    stream.0.codec_type="video"
    stream.0.codec_time_base="911/21845"
    stream.0.codec_tag_string="XVID"
    stream.0.codec_tag="0x44495658"
    stream.0.width=624
    stream.0.height=336
    stream.0.has_b_frames=1
    stream.0.sample_aspect_ratio="1:1"
    stream.0.display_aspect_ratio="13:7"
    stream.0.pix_fmt="yuv420p"
    stream.0.level=5
    
  2. 接下来,我们使用正则表达式来过滤掉纵横比(13:7在我们的例子中)

  3. 最后,我们将视频比例与您的搜索比例进行比较,如果匹配则输出文件路径

相关内容