我的文件夹中有多个图像文件,我只需要三种不同格式(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...}
所以你看它有Width
,Height
所以(就像你的问题一样)你可以通过乘法计算出像素数,然后只选择那些这个数字大于 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
过滤。