crop mit PIL und ein fehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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
BlackJack

@draufunddran: Erklärung und Lösung stehen in der Dokumentation der `crop()`-Methode.
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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...
Benutzeravatar
draufunddran
User
Beiträge: 34
Registriert: Freitag 26. Juni 2009, 13:43

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')
Antworten