Seite 1 von 1

crop mit PIL und ein fehler?

Verfasst: Montag 5. Juli 2010, 13:11
von draufunddran
Hallo Leute,

ich hab gerade angefangen mich mit dem PIL Module (Python Imaging Library) zu beschäftigen und gleich bei einem der ersten Beispiele ein komischen verhalten entdeckt. im PIL Handbook (http://www.pythonware.com/library/pil/h ... uction.htm) gleich beim Beispiel "Rolling an image", und zwar wenn ich ein delta eingebe was größer ist als die hälfte der Bildbreite dann hab ich zwei Schnittkanten im Bild, obwohl es nur eine sein dürfte...
hier mal das beispiel wie ich es ganz einfach implementierthabe...

Code: Alles auswählen

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import Image

def roll(image, delta):
    "Roll an image sideways"
    image = Image.open(image)
    xsize, ysize = image.size
    delta = delta % xsize
    if delta == 0: return image
    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))
    return image

roll('test.jpg', 500).save('test1.jpg')
mein erster gedanke ist, das das crop keine wirkliche Kopie des Ausschnittes erzeugt, sondern erst nachschaut wo den der ausschnitt ist, wenn er wieder eingefügt wird. Dann bekommt man nämlich genau diese Konstellation wie oben beschrieben da dann das zweite crop die kante vom ersten paste enthält....

gibts da abhilfe? kann einer Helfen?

greetz draufunddran

Re: crop mit PIL und ein fehler?

Verfasst: Montag 5. Juli 2010, 13:27
von BlackJack
@draufunddran: Erklärung und Lösung stehen in der Dokumentation der `crop()`-Methode.

Re: crop mit PIL und ein fehler?

Verfasst: Montag 5. Juli 2010, 13:51
von draufunddran
Erstmal danke, das mit dem load hab ich auch schon gelesen aber dann bringt der mir bei der paste funktion einen Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "titledata.py", line 18, in <module>
    roll('test.jpg', 500).save('test1.jpg')
  File "titledata.py", line 14, in roll
    image.paste(part2, (0, 0, xsize-delta, ysize))
  File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1103, in paste
    self.im.paste(im, box)
SystemError: new style getargs format but argument is not a tuple

Code: Alles auswählen

    part1 = image.crop((0, 0, delta, ysize)).load()
    part2 = image.crop((delta, 0, xsize, ysize)).load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))
aber ab 1.1.6 heist es: "load returns a pixel access object that can be used to read and modify pixels." wie bekomm ich das dann wieder in ein region object...

Re: crop mit PIL und ein fehler?

Verfasst: Montag 5. Juli 2010, 14:22
von draufunddran
SOLVED:

man darf das object das load() zurückgibt einfach nicht zuweisen, sondern nur load auf das object anweden...:

Code: Alles auswählen

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import Image

def roll(image, delta):
    "Roll an image sideways"
    image = Image.open(image)
    xsize, ysize = image.size
    delta = delta % xsize
    if delta == 0: return image
    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    part1.load()
    part2.load()
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))
    return image

roll('test.jpg', 900).save('test1.jpg')