4

Я знаю, что могу искать файлы (изображения, видео), имеющие определенные размеры, используя width:1920, height:1080 .

Но как мне искать файлы с, скажем, соотношением сторон 16:9 в Windows 7?

1 ответ1

3

Это невозможно при поиске в Windows 7 Explorer


Тем не менее, вот альтернатива, опираясь на встроенные части 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. Вы можете использовать ffprobe ffmpeg для получения всей информации из видео

    команда

    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. Далее мы используем Regex для фильтрации соотношения сторон (13:7 в нашем примере)

  3. Наконец, мы сравниваем соотношение видео с вашим коэффициентом поиска и выводим путь к файлу, если они совпадают

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .