2009-10-15 8 views
17

Je cherche probablement la mauvaise chose dans le manuel, mais je cherche à prendre un objet image et à l'agrandir sans redimensionner (étirer/écraser) l'image originale.En Python, Python Image Library 1.1.6, comment puis-je développer le canevas sans le redimensionner?

Exemple de jouet: imaginez un rectangle bleu, 200 x 100, puis j'effectue une opération et j'ai un nouvel objet image, 400 x 300, constitué d'un fond blanc sur lequel repose un rectangle bleu de 200 x 100. Bonus si je peux contrôler dans quelle direction cela se développe, ou la nouvelle couleur de fond, etc.

Essentiellement, j'ai une image à laquelle j'ajouterai itérativement, et je ne sais pas quelle sera la taille au départ .

Je suppose qu'il me serait possible de saisir l'objet original, de faire un nouvel objet un peu plus grand, de coller l'original dessus, de dessiner un peu plus, puis de répéter. Il semble que cela pourrait être coûteux en termes de calcul. Cependant, je pensais qu'il y aurait une fonction pour cela, car je suppose que c'est une opération commune. Peut-être que j'ai supposé faux.

Répondre

23

La fonction ImageOps.expand étend l'image, mais ajoute la même quantité de pixels dans chaque direction.

La meilleure façon est tout simplement de faire une nouvelle image et coller:

newImage = Image.new(mode, (newWidth,newHeight)) 
newImage.paste(srcImage, (x1,y1,x1+oldWidth,y1+oldHeight)) 

Si la performance est un problème, faire plus votre image originale que nécessaire et recadrer une fois le dessin terminé.

+0

Si l'image est palettisée ('srcImage.mode ==" P "'), la palette doit également être copiée: 'newImage.putpalette (srcImage.palette.getdata() [1])'. –

4

Vous pourriez envisager une approche plutôt différente de votre image ... construisez-le avec des carreaux de taille fixe. De cette façon, comme vous avez besoin de développer, vous ajoutez simplement de nouvelles mosaïques d'images. Lorsque vous avez terminé tous vos calculs, vous pouvez déterminer la taille finale de l'image, créer une image vide de cette taille et y coller les carreaux. Cela devrait réduire la quantité de copie que vous cherchez pour accomplir la tâche.

(Vous auriez probablement envie de résumer une telle image en mosaïque dans un objet qui a caché les aspects de carrelage des autres couches de code, bien sûr.)

+0

Le traitement d'image le plus évolutif est effectué sur une base de mosaïque. – whatnick

7

Sur la base interjays Réponse:

#!/usr/bin/env python 

from PIL import Image 
import math 


def resize_canvas(old_image_path="314.jpg", new_image_path="save.jpg", 
        canvas_width=500, canvas_height=500): 
    """ 
    Resize the canvas of old_image_path. 

    Store the new image in new_image_path. Center the image on the new canvas. 

    Parameters 
    ---------- 
    old_image_path : str 
    new_image_path : str 
    canvas_width : int 
    canvas_height : int 
    """ 
    im = Image.open(old_image_path) 
    old_width, old_height = im.size 

    # Center the image 
    x1 = int(math.floor((canvas_width - old_width)/2)) 
    y1 = int(math.floor((canvas_height - old_height)/2)) 

    mode = im.mode 
    if len(mode) == 1: # L, 1 
     new_background = (255) 
    if len(mode) == 3: # RGB 
     new_background = (255, 255, 255) 
    if len(mode) == 4: # RGBA, CMYK 
     new_background = (255, 255, 255, 255) 

    newImage = Image.new(mode, (canvas_width, canvas_height), new_background) 
    newImage.paste(im, (x1, y1, x1 + old_width, y1 + old_height)) 
    newImage.save(new_image_path) 

resize_canvas() 
Questions connexes