Question

How do you change the thickness/weight for the rectangle outline drawn with the WriteableBitmapEx.DrawRectangle extension method? The code I use to draw the rectangle is:

WriteableBitmap wbmp = new WriteableBitmap(bmp);
wbmp.DrawRectangle(0, 0, 480, 360, Colors.DarkGray);

Using this code, the thickness of the rectangle drawn in 1px.

Was it helpful?

Solution

Workaround from WritableBitmapEx.Add Thickness param for shapes

//Original points for line
int x1 = (int)pts[0].X;
int y1 = (int)pts[0].Y;
int x2 = (int)pts[1].X;
int y2 = (int)pts[1].Y;

//Parallel line code from http://stackoverflow.com/questions/2825412/draw-a-parallel-line var L = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
var offsetPixels = 4;//Line "thickness"
// This is the second line will be parallel to the first
int x1p = (int)(x1 + offsetPixels * (y2 - y1) / L);
int x2p = (int)(x2 + offsetPixels * (y2 - y1) / L);
int y1p = (int)(y1 + offsetPixels * (x1 - x2) / L);
int y2p = (int)(y2 + offsetPixels * (x1 - x2) / L);

//writeableBmp.DrawLine(x1, y1, x2, y2, Colors.Red);
//writeableBmp.DrawLine(x1p, y1p, x2p, y2p, Colors.Blue);
//Create closed filled polygon for "thick line"
writeableBmp.FillPolygon(new int[] { x1, y1, x2, y2, x2p, y2p, x1p, y1p, x1, y1 }, Colors.Red);

OTHER TIPS

Here's a nice workaround using the lesser known 'inflate' method that already comes from 'Rectangle':

int pen_thickness = 5;

Rectangle original_rect = new Rect(0, 0, 480, 360); // using the poster's original values

for(int i = 0; i < pen_thickness; i++)
{
    Rectangle bigger_rect = Rectangle.Inflate(original_rect, i, i);
    wbmp.DrawRectangle(Pens.DarkGray, bigger_rect);
}

This will create a rectangle that expands from the originally sought rectangle. A quick mod could also be done to have the thickness expand half inwards (negative values for the inflate) and half outwards (positive values for the inflate).

Created the following... works great for WriteableBitmapEx

private static void DrawRectangle(WriteableBitmap bitmap, 
    int left, int top, int width, int height, Color color, int thinkness)
{
    var x1 = left;
    var y1 = top;
    var x2 = left + width;
    var y2 = top + height;

    bitmap.DrawRectangle(x1, y1, x2, y2, color);

    for (var i = 0; i < thinkness; i++)
    {
        bitmap.DrawRectangle(x1--, y1--, x2++, y2++, color);
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top