[Image-SIG] Regarding Wide lines in PIL

Fredrik Lundh fredrik at pythonware.com
Wed May 25 22:42:56 CEST 2005


"rzed" <rzantow at ntelos.net> wrote:

> If I have the correct version of the PIL code, specifying the new width
> parameter to ImageDraw's line() function results in a line of twice the
> specified thickness. It appears to be because, in ImagingDrawWideLine
> (Draw.c), the width is both added to and subtracted from the line
> positions. If dx and dy were halved, the  specification should work
> correctly (within rounding limits, anyway).
>
>      dx = (int) (d * (y1-y0) + 0.5);
>      dy = (int) (d * (x1-x0) + 0.5);
>
>      add_edge(e+0, x0 - dx,  y0 + dy, x1 - dx,  y1 + dy);
>      add_edge(e+1, x1 - dx,  y1 + dy, x1 + dx,  y1 - dy);
>      add_edge(e+2, x1 + dx,  y1 - dy, x0 + dx,  y0 - dy);
>      add_edge(e+3, x0 + dx,  y0 - dy, x0 - dx,  y0 + dy);
>
> To an extent, it can be worked around by halving the width
> specification, of course.

I've attached the 'official' patch.

</F>

Index: libImaging/Draw.c
===================================================================
--- libImaging/Draw.c   (revision 2434)
+++ libImaging/Draw.c   (working copy)
@@ -674,7 +675,7 @@
         return 0;
     }

-    d = width / sqrt(dx*dx + dy*dy);
+    d = width / sqrt(dx*dx + dy*dy) / 2.0;

     dx = (int) (d * (y1-y0) + 0.5);
     dy = (int) (d * (x1-x0) + 0.5);





More information about the Image-SIG mailing list