Add-Type -AssemblyName System.Drawing $outDir = Join-Path (Get-Location) "images\trend-icons" New-Item -ItemType Directory -Force -Path $outDir | Out-Null function New-IconBitmap { $bitmap = New-Object System.Drawing.Bitmap 128, 128, ([System.Drawing.Imaging.PixelFormat]::Format32bppArgb) $graphics = [System.Drawing.Graphics]::FromImage($bitmap) $graphics.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias $graphics.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAliasGridFit $graphics.Clear([System.Drawing.Color]::Transparent) return @($bitmap, $graphics) } function New-Pen($color, $width = 4) { $pen = New-Object System.Drawing.Pen $color, $width $pen.StartCap = [System.Drawing.Drawing2D.LineCap]::Round $pen.EndCap = [System.Drawing.Drawing2D.LineCap]::Round $pen.LineJoin = [System.Drawing.Drawing2D.LineJoin]::Round return $pen } function New-Brush($color) { return New-Object System.Drawing.SolidBrush $color } function Draw-Ball($g, $x, $y, $size, $color1, $color2, $text = "") { $rect = New-Object System.Drawing.RectangleF $x, $y, $size, $size $path = New-Object System.Drawing.Drawing2D.GraphicsPath $path.AddEllipse($rect) $brush = New-Object System.Drawing.Drawing2D.LinearGradientBrush $rect, $color1, $color2, 135 $g.FillPath($brush, $path) $g.DrawPath((New-Pen ([System.Drawing.Color]::FromArgb(160, 255, 255, 255)) 2), $path) if ($text) { $font = New-Object System.Drawing.Font "Arial", 13, ([System.Drawing.FontStyle]::Bold) $format = New-Object System.Drawing.StringFormat $format.Alignment = [System.Drawing.StringAlignment]::Center $format.LineAlignment = [System.Drawing.StringAlignment]::Center $g.DrawString($text, $font, (New-Brush ([System.Drawing.Color]::White)), $rect, $format) $font.Dispose() $format.Dispose() } $brush.Dispose() $path.Dispose() } function Draw-Grid($g) { $gridPen = New-Pen ([System.Drawing.Color]::FromArgb(42, 16, 43, 106)) 2 foreach ($x in @(32, 56, 80, 104)) { $g.DrawLine($gridPen, $x, 24, $x, 104) } foreach ($y in @(32, 56, 80, 104)) { $g.DrawLine($gridPen, 24, $y, 112, $y) } $gridPen.Dispose() } function Draw-Axes($g) { $axisPen = New-Pen ([System.Drawing.Color]::FromArgb(150, 16, 43, 106)) 3 $g.DrawLine($axisPen, 24, 102, 108, 102) $g.DrawLine($axisPen, 24, 102, 24, 24) $axisPen.Dispose() } function Save-Icon($name, [scriptblock]$draw) { $parts = New-IconBitmap $bitmap = $parts[0] $graphics = $parts[1] & $draw $graphics $path = Join-Path $outDir $name $bitmap.Save($path, [System.Drawing.Imaging.ImageFormat]::Png) $graphics.Dispose() $bitmap.Dispose() Write-Host $path } $redA = [System.Drawing.Color]::FromArgb(246, 91, 80) $redB = [System.Drawing.Color]::FromArgb(218, 28, 49) $blueA = [System.Drawing.Color]::FromArgb(74, 158, 255) $blueB = [System.Drawing.Color]::FromArgb(18, 79, 190) $gold = [System.Drawing.Color]::FromArgb(253, 185, 51) $navy = [System.Drawing.Color]::FromArgb(16, 43, 106) $green = [System.Drawing.Color]::FromArgb(36, 196, 132) $purple = [System.Drawing.Color]::FromArgb(138, 92, 246) Save-Icon "ssq-trend.png" { param($g) Draw-Grid $g Draw-Axes $g $linePen = New-Pen $redA 5 $g.DrawLines($linePen, @( [System.Drawing.PointF]::new(28, 82), [System.Drawing.PointF]::new(46, 58), [System.Drawing.PointF]::new(66, 72), [System.Drawing.PointF]::new(88, 42), [System.Drawing.PointF]::new(108, 56) )) $linePen.Dispose() Draw-Ball $g 22 72 25 $redA $redB "06" Draw-Ball $g 56 62 25 $redA $redB "12" Draw-Ball $g 88 46 25 $blueA $blueB "16" } Save-Icon "basic-trend.png" { param($g) Draw-Grid $g Draw-Axes $g $pen1 = New-Pen $navy 5 $pen2 = New-Pen $gold 4 $g.DrawLines($pen1, @( [System.Drawing.PointF]::new(28, 86), [System.Drawing.PointF]::new(46, 76), [System.Drawing.PointF]::new(64, 62), [System.Drawing.PointF]::new(82, 46), [System.Drawing.PointF]::new(106, 36) )) $g.DrawLines($pen2, @( [System.Drawing.PointF]::new(30, 96), [System.Drawing.PointF]::new(54, 90), [System.Drawing.PointF]::new(78, 70), [System.Drawing.PointF]::new(104, 68) )) $pen1.Dispose() $pen2.Dispose() } Save-Icon "number-distribution.png" { param($g) Draw-Grid $g foreach ($row in 0..3) { foreach ($col in 0..4) { $x = 24 + $col * 20 $y = 28 + $row * 18 $color = if (($row + $col) % 3 -eq 0) { $redA } elseif (($row + $col) % 3 -eq 1) { $blueA } else { $gold } Draw-Ball $g $x $y 13 $color ([System.Drawing.Color]::FromArgb($color.A, [Math]::Max(0, $color.R - 32), [Math]::Max(0, $color.G - 32), [Math]::Max(0, $color.B - 32))) "" } } $barBrush = New-Brush ([System.Drawing.Color]::FromArgb(170, 16, 43, 106)) $g.FillRectangle($barBrush, 28, 102, 18, 10) $g.FillRectangle($barBrush, 54, 92, 18, 20) $g.FillRectangle($barBrush, 80, 84, 18, 28) $barBrush.Dispose() } Save-Icon "red-blue-trend.png" { param($g) Draw-Grid $g $redPen = New-Pen $redA 5 $bluePen = New-Pen $blueA 5 $g.DrawLines($redPen, @( [System.Drawing.PointF]::new(22, 82), [System.Drawing.PointF]::new(44, 48), [System.Drawing.PointF]::new(68, 64), [System.Drawing.PointF]::new(92, 34), [System.Drawing.PointF]::new(112, 52) )) $g.DrawLines($bluePen, @( [System.Drawing.PointF]::new(22, 56), [System.Drawing.PointF]::new(44, 76), [System.Drawing.PointF]::new(68, 46), [System.Drawing.PointF]::new(92, 72), [System.Drawing.PointF]::new(112, 36) )) Draw-Ball $g 24 78 19 $redA $redB "" Draw-Ball $g 86 68 19 $blueA $blueB "" $redPen.Dispose() $bluePen.Dispose() } Save-Icon "combined-trend.png" { param($g) Draw-Grid $g $area = New-Object System.Drawing.Drawing2D.GraphicsPath $area.AddPolygon(@( [System.Drawing.PointF]::new(26, 96), [System.Drawing.PointF]::new(26, 74), [System.Drawing.PointF]::new(48, 52), [System.Drawing.PointF]::new(72, 66), [System.Drawing.PointF]::new(102, 38), [System.Drawing.PointF]::new(102, 96) )) $g.FillPath((New-Brush ([System.Drawing.Color]::FromArgb(52, 74, 158, 255))), $area) $pen = New-Pen $purple 5 $g.DrawLines($pen, @( [System.Drawing.PointF]::new(26, 74), [System.Drawing.PointF]::new(48, 52), [System.Drawing.PointF]::new(72, 66), [System.Drawing.PointF]::new(102, 38) )) Draw-Ball $g 72 70 20 $redA $redB "" Draw-Ball $g 92 34 20 $blueA $blueB "" $pieBrush = New-Brush ([System.Drawing.Color]::FromArgb(230, 253, 185, 51)) $g.FillPie($pieBrush, 28, 28, 24, 24, 270, 230) $g.DrawEllipse((New-Pen $navy 3), 28, 28, 24, 24) $area.Dispose() $pen.Dispose() $pieBrush.Dispose() } Save-Icon "blue-trend.png" { param($g) Draw-Grid $g Draw-Axes $g $pen = New-Pen $blueA 5 $g.DrawLines($pen, @( [System.Drawing.PointF]::new(28, 84), [System.Drawing.PointF]::new(46, 66), [System.Drawing.PointF]::new(64, 76), [System.Drawing.PointF]::new(86, 44), [System.Drawing.PointF]::new(108, 58) )) Draw-Ball $g 32 76 21 $blueA $blueB "03" Draw-Ball $g 80 38 21 $blueA $blueB "12" $pen.Dispose() } Save-Icon "blue-amplitude.png" { param($g) $axisPen = New-Pen ([System.Drawing.Color]::FromArgb(150, 16, 43, 106)) 3 $g.DrawLine($axisPen, 24, 64, 108, 64) $g.DrawLine($axisPen, 32, 24, 32, 104) $wavePen = New-Pen $blueA 6 $g.DrawBezier($wavePen, 24, 76, 44, 18, 66, 110, 88, 52) $g.DrawBezier($wavePen, 88, 52, 96, 34, 106, 28, 114, 38) $arrowPen = New-Pen $gold 4 $g.DrawLine($arrowPen, 98, 92, 98, 34) $g.DrawLine($arrowPen, 98, 34, 90, 44) $g.DrawLine($arrowPen, 98, 34, 106, 44) $g.DrawLine($arrowPen, 98, 92, 90, 82) $g.DrawLine($arrowPen, 98, 92, 106, 82) Draw-Ball $g 50 70 22 $blueA $blueB "" $axisPen.Dispose() $wavePen.Dispose() $arrowPen.Dispose() } Save-Icon "blue-tail.png" { param($g) $ringPen = New-Pen $blueA 5 $g.DrawEllipse($ringPen, 26, 22, 76, 76) $font = New-Object System.Drawing.Font "Arial", 24, ([System.Drawing.FontStyle]::Bold) $small = New-Object System.Drawing.Font "Arial", 13, ([System.Drawing.FontStyle]::Bold) $format = New-Object System.Drawing.StringFormat $format.Alignment = [System.Drawing.StringAlignment]::Center $format.LineAlignment = [System.Drawing.StringAlignment]::Center $g.DrawString("0-9", $font, (New-Brush $navy), ([System.Drawing.RectangleF]::new(20, 30, 88, 40)), $format) $g.DrawString("TAIL", $small, (New-Brush $blueB), ([System.Drawing.RectangleF]::new(20, 68, 88, 24)), $format) Draw-Ball $g 78 82 24 $blueA $blueB "7" $ringPen.Dispose() $font.Dispose() $small.Dispose() $format.Dispose() } Save-Icon "blue-two-sum.png" { param($g) Draw-Ball $g 18 42 34 $blueA $blueB "08" Draw-Ball $g 76 42 34 $blueA $blueB "11" $font = New-Object System.Drawing.Font "Arial", 22, ([System.Drawing.FontStyle]::Bold) $format = New-Object System.Drawing.StringFormat $format.Alignment = [System.Drawing.StringAlignment]::Center $format.LineAlignment = [System.Drawing.StringAlignment]::Center $g.DrawString("+", $font, (New-Brush $gold), ([System.Drawing.RectangleF]::new(51, 42, 28, 34)), $format) $sumBrush = New-Brush ([System.Drawing.Color]::FromArgb(230, 16, 43, 106)) $g.FillRectangle($sumBrush, 34, 88, 60, 18) $g.DrawString("=19", (New-Object System.Drawing.Font "Arial", 13, ([System.Drawing.FontStyle]::Bold)), (New-Brush ([System.Drawing.Color]::White)), ([System.Drawing.RectangleF]::new(34, 87, 60, 20)), $format) $font.Dispose() $format.Dispose() $sumBrush.Dispose() } Save-Icon "dev-coming.png" { param($g) $plate = New-Object System.Drawing.RectangleF 18, 28, 92, 64 $plateBrush = New-Object System.Drawing.Drawing2D.LinearGradientBrush $plate, ([System.Drawing.Color]::FromArgb(245, 255, 255, 255)), ([System.Drawing.Color]::FromArgb(235, 232, 239, 250)), 90 $path = New-Object System.Drawing.Drawing2D.GraphicsPath $path.AddArc(18, 28, 16, 16, 180, 90) $path.AddArc(94, 28, 16, 16, 270, 90) $path.AddArc(94, 76, 16, 16, 0, 90) $path.AddArc(18, 76, 16, 16, 90, 90) $path.CloseFigure() $g.FillPath($plateBrush, $path) $g.DrawPath((New-Pen ([System.Drawing.Color]::FromArgb(105, 16, 43, 106)) 2), $path) $pen = New-Pen $blueA 5 $g.DrawLines($pen, @( [System.Drawing.PointF]::new(32, 72), [System.Drawing.PointF]::new(46, 56), [System.Drawing.PointF]::new(62, 64), [System.Drawing.PointF]::new(80, 42), [System.Drawing.PointF]::new(98, 54) )) Draw-Ball $g 28 78 22 $redA $redB "" Draw-Ball $g 74 34 24 $blueA $blueB "" Draw-Ball $g 50 58 20 $gold ([System.Drawing.Color]::FromArgb(232, 140, 20)) "" $font = New-Object System.Drawing.Font "Arial", 15, ([System.Drawing.FontStyle]::Bold) $format = New-Object System.Drawing.StringFormat $format.Alignment = [System.Drawing.StringAlignment]::Center $format.LineAlignment = [System.Drawing.StringAlignment]::Center $g.DrawString("DEV", $font, (New-Brush $navy), ([System.Drawing.RectangleF]::new(30, 94, 68, 24)), $format) $plateBrush.Dispose() $path.Dispose() $pen.Dispose() $font.Dispose() $format.Dispose() }