GrabBag/Tools/VrVirtualCamera/make_icon.ps1
2026-08-04 14:23:07 +08:00

89 lines
3.1 KiB
PowerShell

# Generates VrVirtualCamera.ico (256x256 PNG inside ICO container)
# Run: powershell -ExecutionPolicy Bypass -File make_icon.ps1
Add-Type -AssemblyName System.Drawing
$size = 256
$bmp = New-Object System.Drawing.Bitmap($size, $size)
$g = [System.Drawing.Graphics]::FromImage($bmp)
$g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias
$g.Clear([System.Drawing.Color]::Transparent)
# ---- Draw a simple camera icon ----
$bodyColor = [System.Drawing.Color]::FromArgb(255, 41, 128, 185) # blue
$lensColor = [System.Drawing.Color]::FromArgb(255, 52, 152, 219) # lighter blue
$ringColor = [System.Drawing.Color]::FromArgb(255, 200, 230, 255) # light ring
$darkColor = [System.Drawing.Color]::FromArgb(255, 23, 70, 100) # dark accent
# Body: rounded rectangle
$brushBody = New-Object System.Drawing.SolidBrush($bodyColor)
$bodyRect = New-Object System.Drawing.Rectangle(28, 90, 200, 128)
$radius = 24
$path = New-Object System.Drawing.Drawing2D.GraphicsPath
$d = $radius * 2
$path.AddArc($bodyRect.X, $bodyRect.Y, $d, $d, 180, 90)
$path.AddArc($bodyRect.Right - $d, $bodyRect.Y, $d, $d, 270, 90)
$path.AddArc($bodyRect.Right - $d, $bodyRect.Bottom - $d, $d, $d, 0, 90)
$path.AddArc($bodyRect.X, $bodyRect.Bottom - $d, $d, $d, 90, 90)
$path.CloseFigure()
$g.FillPath($brushBody, $path)
# Viewfinder bump on top
$brushView = New-Object System.Drawing.SolidBrush($bodyColor)
$g.FillRectangle($brushView, 90, 60, 76, 40)
# Lens: outer ring
$brushRing = New-Object System.Drawing.SolidBrush($ringColor)
$ringRect = New-Object System.Drawing.Rectangle(72, 120, 112, 112)
$g.FillEllipse($brushRing, $ringRect)
# Lens: inner
$brushLens = New-Object System.Drawing.SolidBrush($lensColor)
$lensRect = New-Object System.Drawing.Rectangle(88, 136, 80, 80)
$g.FillEllipse($brushLens, $lensRect)
# Lens: dark pupil
$brushDark = New-Object System.Drawing.SolidBrush($darkColor)
$pupilRect = New-Object System.Drawing.Rectangle(110, 158, 36, 36)
$g.FillEllipse($brushDark, $pupilRect)
# Small indicator dot (red) on body corner
$brushRed = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(255, 231, 76, 60))
$g.FillEllipse($brushRed, 200, 105, 14, 14)
$g.Dispose()
# Save PNG in memory
$ms = New-Object System.IO.MemoryStream
$bmp.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
$pngBytes = $ms.ToArray()
$ms.Dispose()
$bmp.Dispose()
# ---- Pack into ICO container (single 256x256 PNG) ----
$icoPath = Join-Path $PSScriptRoot "VrVirtualCamera.ico"
$fs = [System.IO.File]::Create($icoPath)
$bw = New-Object System.IO.BinaryWriter($fs)
# ICONDIR
$bw.Write([UInt16]0) # reserved
$bw.Write([UInt16]1) # type = icon
$bw.Write([UInt16]1) # count = 1
# ICONDIRENTRY
$bw.Write([Byte]0) # width 0 = 256
$bw.Write([Byte]0) # height 0 = 256
$bw.Write([Byte]0) # colorCount
$bw.Write([Byte]0) # reserved
$bw.Write([UInt16]1) # planes
$bw.Write([UInt16]32) # bitCount
$bw.Write([UInt32]$pngBytes.Length) # bytesInRes
$bw.Write([UInt32]22) # imageOffset
# PNG data
$bw.Write($pngBytes)
$bw.Close()
$fs.Close()
Write-Host "Generated $icoPath ($($pngBytes.Length) bytes)"