List Info

Thread: some bug in PIL, with test case




some bug in PIL, with test case
user name
2007-02-11 16:30:34
Hello

I used PIL for the first time and found some bugs.
The code and description follow.

The main problem is that drawing a line from A to B dont get
the same result
as from B to A!
And because of this (I thing) the color of a polygon
overflow it's outline.

And last i found the size of a rotated image unpredictable!
The error is only of one 1 pixel, but this is enough to have
to image
cover another or have a blank between them.

Best regards

Alain

Here is the code

def pil_bugs():

    imgs=[]

    # here the color of the polygone overflow the outline !
    polygon=[(82, 39), (81, 8), (76, 0), (42, 0), (37, 7),
(47, 39)]
    img=Image.new('RGB', (100, 100), (255, 255, 255))
    draw=ImageDraw.Draw(img)
    draw.polygon(polygon, fill=(255,128,128),
outline=(0,0,0))
    del draw
    imgs.append(img)

    # here I draw multiple line with different gradient
    # first from "center" to outside
    # and second from outside to inside
    # the second line don't match exactly the first one !
    img=Image.new('RGB', (200, 200), (255, 255, 255))
    w, h=img.size
    cx, cy=w/2, h/2
    pts=[ (80,0), (80,20), (80,40), (80, 60), (80,80) ]
    draw=ImageDraw.Draw(img)
    for x, y in pts:
        draw.line((cx, cy, cx+x, cy+y), (0,0,0))
        draw.line((cx, cy, cx+y, cy+x), (0,0,0))
        draw.line((cx, cy, cx-x, cy+y), (0,0,0))
        draw.line((cx, cy, cx-y, cy+x), (0,0,0))
        draw.line((cx, cy, cx-x, cy-y), (0,0,0))
        draw.line((cx, cy, cx-y, cy-x), (0,0,0))
        draw.line((cx, cy, cx+x, cy-y), (0,0,0))
        draw.line((cx, cy, cx+y, cy-x), (0,0,0))

        draw.line((cx+x, cy+y, cx, cy), (255,0,0))
        draw.line((cx+y, cy+x, cx, cy), (255,0,0))
        draw.line((cx-x, cy+y, cx, cy), (255,0,0))
        draw.line((cx-y, cy+x, cx, cy), (255,0,0))
        draw.line((cx-x, cy-y, cx, cy), (255,0,0))
        draw.line((cx-y, cy-x, cx, cy), (255,0,0))
        draw.line((cx+x, cy-y, cx, cy), (255,0,0))
        draw.line((cx+y, cy-x, cx, cy), (255,0,0))
    del draw
    imgs.append(img)

    # this test compare the logical size of a rotated image
with the real one
    img=Image.new('RGB', (100, 27), (255, 255, 255))
    w, h=img.size
    for alpha in range(0, 90, 1):
        riw, rih=img.rotate(alpha, Image.BICUBIC,
True).size
       
u=h*math.sin(math.radians(alpha))+w*math.cos(math.radians(al
pha))
       
v=w*math.sin(math.radians(alpha))+h*math.cos(math.radians(al
pha))
        rfw, rfh=int(math.floor(u)), int(math.floor(v))
        rcw, rch=int(math.ceil(u)), int(math.ceil(v))
        print '%3d: %3dx%3d  %5.1fx%5.1f floor %-2d %-2d 
ceil %-2d
%-2d' % ( alpha, riw, rih, u, v, riw-rfw , rih-rfh, riw-rcw,
rih-rch)

    # this is not a bug, but why to mix size and vertices ?
    # 99!=100 this could disturb the user that must make +1
or -1
    img=Image.new('RGB', (100, 100), (255, 255, 255))
    img=img.transform(img.size, Image.MESH, [((0, 0, 100,
100),
(0,0,0,99,99,99,99,0))], Image.BICUBIC)
    # imgs.append(img)

    return imgs












--
Alain Spineux
aspineux gmail com
May the sources be with you
_______________________________________________
Image-SIG maillist  -  Image-SIGpython.org
htt
p://mail.python.org/mailman/listinfo/image-sig

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )