Smart image search via Powershell

前端 未结 2 895
挽巷
挽巷 2021-02-06 04:30

I am interested in file searching by custom properties. For example, I want to find all JPEG-images with certain dimensions. Something looks like

Get-ChildItem -         


        
相关标签:
2条回答
  • 2021-02-06 04:54

    Here's an alternative implementation as a (almost) one-liner:

    Add-Type -Assembly System.Drawing
    
    Get-ChildItem -Path C:\ -Filter *.jpg -Recursive | ForEach-Object { [System.Drawing.Image]::FromFile($_.FullName) } | Where-Object { $_.Width -eq 1024 -and $_.Height -eq 768 }
    

    If you are going to need to run this command more than once, I would recommend Johannes' more complete solution instead.

    0 讨论(0)
  • 2021-02-06 05:03

    That's actually pretty easy to do and your gut feeling about System.Drawing was in fact correct:

    Add-Type -Assembly System.Drawing
    
    $input | ForEach-Object { [Drawing.Image]::FromFile($_) }
    

    Save that as Get-Image.ps1 somewhere in your path and then you can use it.

    Another option would be to add the following to your $profile:

    Add-Type -Assembly System.Drawing
    
    function Get-Image {
        $input | ForEach-Object { [Drawing.Image]::FromFile($_) }
    }
    

    which works pretty much the same. Of course, add fancy things like documentation or so as you see fit.

    You can then use it like so:

    gci -inc *.jpg -rec | Get-Image | ? { $_.Width -eq 1024 -and $_.Height -eq 768 }
    

    Note that you should dispose the objects created this way after using them.

    Of course, you can add a custom Dimension property so you could filter for that:

    function Get-Image {
        $input |
            ForEach-Object { [Drawing.Image]::FromFile($_) } |
            ForEach-Object {
                $_ | Add-Member -PassThru NoteProperty Dimension ('{0}x{1}' -f $_.Width,$_.Height)
            }
    }
    
    0 讨论(0)
提交回复
热议问题