2010-10-01 32 views
2

J'essaie de recadrer une image, puis de coller l'image recadrée au centre d'une autre image. Idéalement, j'aimerais que l'image recadrée soit plus petite que l'image sur laquelle elle est collée de sorte qu'il y ait une bordure autour de l'image collée, mais je ne sais pas si c'est possible.Problème de recadrage et de collage PIL: Le recadrage ne crée pas d'image recadrée

Voici ce que j'ai essayé (avec le message d'erreur résultant):

>>> import Image 
>>> grey = Image.new('RGB', (200, 200), "grey") 
>>> House = Image.open("House01.jpg") 
>>> print grey.size, grey.mode, grey.format 
>>>(200, 200) RGB None 
>>> print House.size, House.mode, House.format 
>>>(300, 300) RGB JPEG 
>>> box = (25, 25, 25, 25) 
>>> House.crop(box) 
>>>Image._ImageCrop image mode=RGB size=0x0 at 0x11AD210> 
>>> region = House.crop(box) 
>>> region.show() 
>>>Traceback (most recent call last): 
>>> File "<pyshell#28>", line 1, in <module> 
    region.show() 
>>> File "C:\Python26\lib\site-packages\PIL\Image.py", line 1483, in show 
    _show(self, title=title, command=command) 
>>> File "C:\Python26\lib\site-packages\PIL\Image.py", line 2123, in _show 
    apply(_showxv, (image,), options) 
>>> File "C:\Python26\lib\site-packages\PIL\Image.py", line 2127, in _showxv 
    apply(ImageShow.show, (image, title), options) 
>>> File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 41, in show 
    if viewer.show(image, title=title, **options): 
>>> File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 66, in show 
    self.show_image(image, **options) 
>>> File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 85, in show_image 
    return self.show_file(self.save_image(image), **options) 
>>> File "C:\Python26\lib\site-packages\PIL\ImageShow.py", line 81, in save_image 
    return image._dump(format=self.get_format(image)) 
>>> File "C:\Python26\lib\site-packages\PIL\Image.py", line 493, in _dump 
    self.save(file, format) 
>>> File "C:\Python26\lib\site-packages\PIL\Image.py", line 1439, in save 
    save_handler(self, fp, filename) 
>>> File "C:\Python26\lib\site-packages\PIL\BmpImagePlugin.py", line 242, in _save 
    ImageFile._save(im, fp, [("raw", (0,0)+im.size, 0, (rawmode, stride, -1))]) 
>>> File "C:\Python26\lib\site-packages\PIL\ImageFile.py", line 498, in _save 
    e.setimage(im.im, b) 
>>>SystemError: tile cannot extend outside image 

Je peux voir que la taille « région » a été (0,0) mais je ne comprends pas pourquoi .

Toute aide sur ce serait un grand merci

Répondre

6

Le PIL documentation pour les états de la méthode de récolte:

Returns a rectangular region from the current image. The box is a 4-tuple defining the left, upper, right, and lower pixel coordinate.

This is a lazy operation. Changes to the source image may or may not be reflected in the cropped image. To get a separate copy, call the load method on the cropped copy.

Alors, vous devriez essayer region = House.crop(box).load() pour vous assurer d'obtenir une copie recadrée réelle.

MISE À JOUR:
En fait, il semble que ci-dessus ne fonctionne que si vous utilisez PIL 1.1.6 et versions ultérieures. Dans les versions antérieures, je suppose que load() ne renvoie rien, donc vous ne pouvez pas enchaîner les opérations. Dans ce cas, utilisez:

region = House.crop(box) 
region.load() 
+0

Merci pour l'aide. Je suis entré dans ta suggestion, suivie region.show() et maintenant le message d'erreur: retraçage (le plus récent appel dernier): Fichier "", ligne 1, dans region.show() AttributeError: L'objet 'NoneType' n'a aucun attribut 'show' – Jordan

0

J'ai eu une erreur similaire que je ne semblais pas à résoudre, mais je puis réalisé que vous avez fait ce qu'il fallait faire avec les arguments transmis à Image.crop(). Vous pouvez voir que la taille de votre image est (0,0) donc il n'y a rien à montrer. Vous définissez des limites du point (25,25) à (25,25).

Si vous avez besoin d'un 25x25 recadrée l'image (en partant du haut à gauche): `` ` >

>> import Image 
>>> grey = Image.new('RGB', (200, 200), "grey") 
>>> House = Image.open("House01.jpg") 
>>> print grey.size, grey.mode, grey.format 
>>>(200, 200) RGB None 
>>> print House.size, House.mode, House.format 
>>>(300, 300) RGB JPEG 
>>> box = (0, 0, 25, 25) 
>>> House.crop(box) 
>>>Image._ImageCrop image mode=RGB size=0x0 at 0x11AD210> 
>>> region = House.crop(box) 
>>> region.show() 

` `` Si vous voulez commencer à partir du centre ou d'un autre point que je voudrais utiliser ce link comme référence: