-
Notifications
You must be signed in to change notification settings - Fork 5
/
ConvertTo-Icon.ps1
63 lines (54 loc) · 2.04 KB
/
ConvertTo-Icon.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
function ConvertTo-Icon{
<#
.Synopsis
Converts image to icons
.Description
Converts an image to an icon
.Example
ConvertTo-Icon -File .\Logo.png -OutputFile .\Favicon.ico
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, Position=0,ValueFromPipelineByPropertyName=$true)]
[Alias('Fullname')]
[string]$File,
[switch]$InMemory,
# If provided, will output the icon to a location
[Parameter(Position=1, ValueFromPipelineByPropertyName=$true)]
[string]$OutputFile
)
begin {
Add-Type -AssemblyName System.Windows.Forms, System.Drawing
}
process {
#region Load Icon
$resolvedFile = $ExecutionContext.SessionState.Path.GetResolvedPSPathFromPSPath($file)
if (-not $resolvedFile) { return }
$loadedImage = [Drawing.Image]::FromFile($resolvedFile)
$intPtr = New-Object IntPtr
$thumbnail = $loadedImage.GetThumbnailImage(72, 72, $null, $intPtr)
$bitmap = New-Object Drawing.Bitmap $thumbnail
$bitmap.SetResolution(72, 72);
$icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon());
#endregion Load Icon
#region Save Icon
if ($InMemory) {
$memStream = New-Object IO.MemoryStream
$icon.Save($memStream)
$memStream.Seek(0,0)
$bytes = New-Object Byte[] $memStream.Length
$memStream.Read($bytes, 0, $memStream.Length)
$bytes
} elseif ($OutputFile) {
$resolvedOutputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($outputFile)
$fileStream = [IO.File]::Create("$resolvedOutputFile")
$icon.Save($fileStream)
$fileStream.Close()
}
#endregion Save Icon
#region Cleanup
$icon.Dispose()
$bitmap.Dispose()
#endregion Cleanup
}
}