2012-05-18 14 views
13

Dla tego projektu nad którym pracuję, mam 2 zdjęcia. Te dwa zdjęcia należy zszyć razem, jeden na górze i jeden na dole, a następnie będzie można zobaczyć cały obraz. Jakieś pomysły na temat modułu, który powinienem użyć, aby to zrobić?Łączenie zdjęć razem

+1

Czy zachodzą na siebie jak panorama? A może potrzebujesz jednego większego obrazu, umieszczając dwa mniejsze obok siebie? – Leopd

Odpowiedz

19

Ten posiłek zjemy na śniadanie.

Zobacz artykuł tutorial, w szczególności sekcja "Przycinanie, wklejanie i scalanie obrazów", aby uzyskać pomoc.

Na ogólnym zarysie, załadować zarówno obrazy z Image.open, dowiedzieć się, jak duży obraz wyjściowy będzie za pomocą atrybutu size i jakiś dodatek, tworzenie obrazu wyjściowego z Image.new a następnie użyć metody paste do przeszłości dwóch oryginalnych obrazów w.

+1

Czy mógłbyś trochę o tym powiedzieć? Jakie funkcje chciałbym użyć? Jakieś wskazówki? –

+5

Dodałem kilka wskazówek do odpowiedzi. Normalnie napisałbym program demo, ale to był długi tydzień i kusi świetny napój alkoholowy ;-) –

+0

Świetnie! To było idealne. Dzięki za pomoc –

2

To jest kod z wizji komputerowej Jana Eryka Solema z książką Pythona; prawdopodobnie można go zmienić, by zmieścić się góra/dół musi

def stitchImages(im1,im2): 
    '''Takes 2 PIL Images and returns a new image that 
    appends the two images side-by-side. ''' 

    # select the image with the fewest rows and fill in enough empty rows 
    rows1 = im1.shape[0]  
    rows2 = im2.shape[0] 

    if rows1 < rows2: 
     im1 = concatenate((im1,zeros((rows2-rows1,im1.shape[1]))), axis=0) 
    elif rows1 > rows2: 
     im2 = concatenate((im2,zeros((rows1-rows2,im2.shape[1]))), axis=0) 
    # if none of these cases they are equal, no filling needed. 

    return concatenate((im1,im2), axis=1) 
15

Oto przykładowy kod korzystania Pillow. Mam nadzieję, że to komuś pomaga!

from PIL import Image 

def merge_images(file1, file2): 
    """Merge two images into one, displayed side by side 
    :param file1: path to first image file 
    :param file2: path to second image file 
    :return: the merged Image object 
    """ 
    image1 = Image.open(file1) 
    image2 = Image.open(file2) 

    (width1, height1) = image1.size 
    (width2, height2) = image2.size 

    result_width = width1 + width2 
    result_height = max(height1, height2) 

    result = Image.new('RGB', (result_width, result_height)) 
    result.paste(im=image1, box=(0, 0)) 
    result.paste(im=image2, box=(width1, 0)) 
    return result 
+3

ten kod działa, właśnie go przetestowałem. Możesz zapisać plik za pomocą tego kodu -> merged = merge_images (file1, file2) merged.save (file_dest) – fedmich

+0

Pytanie dotyczyło jednego obrazu na drugim, czyli tylko rzutowania akcji na result_width z result_height – Ywapom