add app icon (assets/icon.ico) + generator
Embed via PyInstaller --icon in CI. Regenerate with tools/make_icon.ps1.
This commit is contained in:
parent
540bad0ecb
commit
2e82058a91
3 changed files with 70 additions and 1 deletions
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -28,7 +28,7 @@ jobs:
|
|||
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Build executable
|
||||
run: python -m PyInstaller --onefile --uac-admin --console --name dhcpsrv --paths src dhcpsrv-launcher.py
|
||||
run: python -m PyInstaller --onefile --uac-admin --console --name dhcpsrv --icon assets/icon.ico --paths src dhcpsrv-launcher.py
|
||||
|
||||
- name: Package portable folder
|
||||
shell: pwsh
|
||||
|
|
|
|||
BIN
assets/icon.ico
Normal file
BIN
assets/icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
69
tools/make_icon.ps1
Normal file
69
tools/make_icon.ps1
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
# Regenerate assets/icon.ico for this project.
|
||||
# Edit $Text / colors below and re-run.
|
||||
|
||||
param(
|
||||
[string]$Text = "DHCP",
|
||||
[int[]]$ColorFrom = @(80, 160, 255),
|
||||
[int[]]$ColorTo = @(20, 60, 140),
|
||||
[string]$OutPath = "$PSScriptRoot\..\assets\icon.ico"
|
||||
)
|
||||
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
|
||||
$outDir = Split-Path $OutPath -Parent
|
||||
if (-not (Test-Path $outDir)) { New-Item -ItemType Directory -Path $outDir -Force | Out-Null }
|
||||
|
||||
$bgFrom = [System.Drawing.Color]::FromArgb(255, $ColorFrom[0], $ColorFrom[1], $ColorFrom[2])
|
||||
$bgTo = [System.Drawing.Color]::FromArgb(255, $ColorTo[0], $ColorTo[1], $ColorTo[2])
|
||||
|
||||
$sizes = 256, 128, 64, 48, 32, 16
|
||||
$pngs = @()
|
||||
foreach ($s in $sizes) {
|
||||
$bmp = New-Object System.Drawing.Bitmap $s, $s
|
||||
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||
$g.SmoothingMode = 'AntiAlias'
|
||||
$g.TextRenderingHint = 'AntiAliasGridFit'
|
||||
|
||||
$path = New-Object System.Drawing.Drawing2D.GraphicsPath
|
||||
$r = $s - 2
|
||||
$path.AddEllipse(1, 1, $r, $r)
|
||||
$brush = New-Object System.Drawing.Drawing2D.PathGradientBrush($path)
|
||||
$brush.CenterColor = $bgFrom
|
||||
$brush.SurroundColors = @($bgTo)
|
||||
$g.FillEllipse($brush, 1, 1, $r, $r)
|
||||
|
||||
$pen = New-Object System.Drawing.Pen ([System.Drawing.Color]::FromArgb(60, 0, 0, 0)), ([float]($s/64))
|
||||
$g.DrawEllipse($pen, 1, 1, $r, $r)
|
||||
|
||||
$fontSize = [float]($s * 0.32)
|
||||
$font = New-Object System.Drawing.Font "Segoe UI Black", $fontSize, ([System.Drawing.FontStyle]::Bold), ([System.Drawing.GraphicsUnit]::Pixel)
|
||||
$sf = New-Object System.Drawing.StringFormat
|
||||
$sf.Alignment = 'Center'; $sf.LineAlignment = 'Center'
|
||||
$shadow = New-Object System.Drawing.SolidBrush ([System.Drawing.Color]::FromArgb(80, 0, 0, 0))
|
||||
$g.DrawString($Text, $font, $shadow, [float]($s/2 + $s*0.02), [float]($s/2 + $s*0.02), $sf)
|
||||
$g.DrawString($Text, $font, [System.Drawing.Brushes]::White, [float]($s/2), [float]($s/2), $sf)
|
||||
$g.Dispose()
|
||||
|
||||
$ms = New-Object System.IO.MemoryStream
|
||||
$bmp.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||
$pngs += ,@{ size = $s; bytes = $ms.ToArray() }
|
||||
$ms.Dispose(); $bmp.Dispose()
|
||||
}
|
||||
|
||||
$fs = [System.IO.File]::Create($OutPath)
|
||||
$bw = New-Object System.IO.BinaryWriter $fs
|
||||
$bw.Write([uint16]0)
|
||||
$bw.Write([uint16]1)
|
||||
$bw.Write([uint16]$pngs.Count)
|
||||
$offset = 6 + 16 * $pngs.Count
|
||||
foreach ($p in $pngs) {
|
||||
$w = if ($p.size -ge 256) { 0 } else { $p.size }
|
||||
$bw.Write([byte]$w); $bw.Write([byte]$w)
|
||||
$bw.Write([byte]0); $bw.Write([byte]0)
|
||||
$bw.Write([uint16]1); $bw.Write([uint16]32)
|
||||
$bw.Write([uint32]$p.bytes.Length); $bw.Write([uint32]$offset)
|
||||
$offset += $p.bytes.Length
|
||||
}
|
||||
foreach ($p in $pngs) { $bw.Write($p.bytes) }
|
||||
$bw.Close(); $fs.Close()
|
||||
Write-Host "Wrote $OutPath"
|
||||
Loading…
Reference in a new issue