Dycey
Dycey

Reputation: 4685

How do I use a LinearGradientBrush to fill a rectangle in PowerShell?

I have some lovely PowerShell code, cribbed from another answer, but I'd like to be able to add a gradient filled end to the block:

Add-Type -AssemblyName System.Drawing
$bmp = new-object System.Drawing.Bitmap 208,61
$brushBg = [System.Drawing.Brushes]::Blue

# replace this line...
$brushGr = [System.Drawing.Brushes]::Yellow

$graphics = [System.Drawing.Graphics]::FromImage($bmp)
$graphics.FillRectangle($brushBg,0,0,$bmp.Width,$bmp.Height)
$graphics.FillRectangle($brushGr ,$bmp.Width-50,0,50,$bmp.Height)
$graphics.Dispose()
$bmp.Save($filename)

Google so far not my friend, as I don't understand how to concert the MSDN docs for C# and VB to PowerShell equivalent. My guess for the replacement lines are something like:

# ... with these lines
$col1 = new-object System.Drawing.Color.FromRgb( 209, 227, 250)
$col2 = new-object System.Drawing.Color.FromRgb(170, 199, 238)
$pt1  = new-object System.Drawing.Point(0.5, 0)
$pt2  = new-object System.Drawing.Point(0.5, 1)
$brushGr  = new-object System.Drawing.LinearGradientBrush( $col1 , $col2, $pt1, $pt2)

Any help greatly appreciated.


Thanks to the great answer from Dharmatech below, and in case it's any use to anyone else, here's the working code I ended up with for drawing marking bars ( save in MYFILENAME.ps1, and run it using powershell -ExecutionPolicy Bypass -file MYFILENAME.ps1 )

Add-Type -AssemblyName System.Drawing

$filename ="$env:userprofile\Desktop\px95.png"
$bitmap = New-Object System.Drawing.Bitmap  95,19

$barBlendWidth = 20

$start = $bitmap.Width - $barBlendWidth
$mid  = $bitmap.Width - ( 0 + $barBlendWidth / 2 )

$p0 = New-Object System.Drawing.Point($start, 10 )
$p1 = New-Object System.Drawing.Point($mid, 10 )
$p2 = New-Object System.Drawing.Point($bitmap.Width, 10 )

$fromColour = [System.Drawing.Color]::FromArgb(255, 144, 238, 144)
$midColour = [System.Drawing.Color]::FromArgb(255, 255, 255, 255)
$toColour = [System.Drawing.Color]::FromArgb(255, 255, 255, 70)

$brushBG = [System.Drawing.Brushes]::LightGreen
$brush1 = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p0, $p1, $fromColour, $midColour)
$brush2 = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p1 , $p2, $midColour, $toColour)

$graphics = [System.Drawing.Graphics]::FromImage($bitmap)

$graphics.FillRectangle($brushBG, 0, 0, $bitmap.Width, $bitmap.Height)
$graphics.FillRectangle($brush1 , $start ,0,$barBlendWidth,$bitmap.Height)
$graphics.FillRectangle($brush2 , $mid ,0,$barBlendWidth,$bitmap.Height)

$bitmap.Save($filename)

Upvotes: 2

Views: 2070

Answers (1)

dharmatech
dharmatech

Reputation: 9497

Here's an example which appears to work:

Add-Type -AssemblyName System.Drawing

$bitmap = New-Object System.Drawing.Bitmap 100, 100

$p0 = New-Object System.Drawing.Point(0, 0)
$p1 = New-Object System.Drawing.Point(100, 100)

$c0 = [System.Drawing.Color]::FromArgb(255, 255, 0, 0)
$c1 = [System.Drawing.Color]::FromArgb(255, 0, 0, 255)

$brush = New-Object System.Drawing.Drawing2D.LinearGradientBrush($p0, $p1, $c0, $c1)

$graphics = [System.Drawing.Graphics]::FromImage($bitmap)

$graphics.FillRectangle($brush, 0, 0, $bitmap.Width, $bitmap.Height)

$bitmap.Save('c:\temp\test.bmp')

The resulting image:

enter image description here

Here's a variation using inline expressions:

Add-Type -AssemblyName System.Drawing

$bitmap = New-Object System.Drawing.Bitmap 100, 100

[System.Drawing.Graphics]::FromImage($bitmap).FillRectangle(
    (New-Object System.Drawing.Drawing2D.LinearGradientBrush(
        (New-Object System.Drawing.Point(0, 0)), 
        (New-Object System.Drawing.Point(100, 100)),
        [System.Drawing.Color]::FromArgb(255, 255, 0, 0),
        [System.Drawing.Color]::FromArgb(255, 0, 0, 255))),
    0, 0, $bitmap.Width, $bitmap.Height)

$bitmap.Save('c:\temp\test-d.bmp')

Upvotes: 2

Related Questions