使用 Powershell 列出超过 4M 像素的图像

使用 Powershell 列出超过 4M 像素的图像

我的文件夹中有多个图像文件,我只需要三种不同格式(jpeg、png 和 gif)的详细信息。我需要找到超过 400 万像素的图像,因此宽度乘以高度不能超过 400 万像素。基本上,我只需要一个超出限制的图像列表,并可能显示总像素量。有没有办法用 Powershell 来做这件事?请随意推荐一些可以做到这一点的其他程序。

我找到了这个问题并根据我的目的对其进行了一些编辑:

Add-Type -Assembly System.Drawing

function Get-Image { 
process {
          $file = $_
          [Drawing.Image]::FromFile($_.FullName) |
          ForEach-Object {           
            $_ | Add-Member -PassThru NoteProperty FullName ('{0}' -f $file.FullName)
          }
         }
}

Get-ChildItem -Path 'C:\imagefolder' -Filter *.jpg -Recurse | Get-Image | ? { ($_.Width * $_.Height) -gt 4000000 } | select -expa Fullname | get-item

现在,我收到一份超过 400 万像素限制的 jpg 图像列表。如果我不使用过滤器,它会检查文件夹中的所有文件,并对所有非图像文件抛出错误。这实际上不是一个大问题,但最好只检查 jpg、png 和 gif 文件。

另外,我仍然无法看到图像的总像素大小,并且也不知道如何做到这一点。

答案1

首先,您需要选择文件类型,如这个问题所以你会想要使用这样的方法-Include而不是-Filter

Get-ChildItem -Path 'C:\imagefolder' -Include('*.jpg','*.png','.gif') -Recurse

从这些中,您只想选择超过 400 万像素的像素。您可以使用Get-Image问题中的函数 - 如果您Select *查看其输出,则可以看到它为您提供了什么。

PS C:\> Get-ChildItem -Path 'C:\imagefolder' -Include('*.jpg','*.png','.gif') -Recurse | Get-Image | Select *


FullName             : C:\imagefolder\DSC00237.JPG
Tag                  :
PhysicalDimension    : {Width=5152, Height=3864}
Size                 : {Width=5152, Height=3864}
Width                : 5152
Height               : 3864
HorizontalResolution : 350
VerticalResolution   : 350
Flags                : 77840
RawFormat            : [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format24bppRgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {270, 271, 272, 274...}
PropertyItems        : {270, 271, 272, 274...}

所以你看它有WidthHeight所以(就像你的问题一样)你可以通过乘法计算出像素数,然后只选择那些这个数字大于 4m 的对象Where { ($_.Width * $_.Height) -gt 4000000 }

最后,您想Select从可用属性中显示什么。您可以重命名计算字段,如所述这里因此,对于名称和像素,您需要Select Fullname, @{N='Pixels'; E={ ($_.Width * $_.Height) }}提供

Get-ChildItem -Path 'C:\imagefolder' -Include('*.jpg','*.png','.gif') -Recurse | `
Get-Image | Where { ($_.Width * $_.Height) -gt 4000000 } | `
Select Fullname, @{N='Pixels'; E={ ($_.Width * $_.Height) }}

改变路径和像素数后,输出如下:

PS D:\> Add-Type -Assembly System.Drawing
PS D:\> function Get-Image{
>> process {
>>           $file = $_
>>           [Drawing.Image]::FromFile($_.FullName)  |
>>           ForEach-Object{
>>             $_ | Add-Member -PassThru NoteProperty FullName ('{0}' -f $file.FullName)
>>           }
>>          }
>> }
PS D:\> Get-ChildItem -Path 'D:\Hali\OneDrive\Pictures\2004' -Include('*.jpg','*.png','.gif') -Recurse | Get-Image | Where { ($_.Width * $_.Height) -gt 100000 } | Select Fullname, @{N='Pixels'; E={ ($_.Width * $_.Height)  }}    
FullName                                                                  Pixels
--------                                                                  ------
D:\Hali\OneDrive\Pictures\2004\06\PICT0262 (2014_05_15 20_48_01 UTC).jpg 5038848
D:\Hali\OneDrive\Pictures\2004\06\PICT0264 (2014_05_15 20_48_01 UTC).jpg 5038848
D:\Hali\OneDrive\Pictures\2004\06\PICT0265 (2014_05_15 20_48_01 UTC).jpg 5038848
D:\Hali\OneDrive\Pictures\2004\06\PICT0266 (2014_05_15 20_48_01 UTC).jpg 5038848

答案2

你的脚本已经基本完成了。你已经在过滤了。不过Get-ChildItem仅支持单个过滤器。但稍后您已经使用Where-Object用其简写 ( ?{})。只需在Get-ChildItem扩展名的 and 过滤器之后执行此操作即可。您可以使用以下方式获取有关对象的信息Get-Member

通过运行找出哪些属性包含扩展名Get-ChildItem example.jpg | Get-Member,然后使用该属性进行Where-Object过滤。

相关内容