Soru Python Görüntü Kitaplığı: 4 görüntüyü 2 x 2 ızgarada nasıl birleştirirsiniz?


Bir animasyon için resimlerle 4 dizinim var. Animasyonun her karesi için 2x2 ızgara içine yerleştirilmiş 4 görüntü ile tek bir görüntü oluşturmak ve görüntü setini almak istiyorum.

Kodum şu ana kadar:

import Image

fluid64 = "Fluid64_half_size/00"
fluid128 = "Fluid128_half_size/00"
fluid512 = "Fluid512_half_size/00" 
fluid1024 = "Fluid1024_half_size/00" 

out_image = "Fluid_all/00"

for pic in range(1, 26):
    blank_image = Image.open("blank.jpg")

    if pic < 10:
        image_num = "0"+str(pic)
    else:
        image_num = str(pic)

    image64 = Image.open(fluid64+image_num+".jpg")
    image128 = Image.open(fluid128+image_num+".jpg")
    image512 = Image.open(fluid512+image_num+".jpg")
    image1024 = Image.open(fluid1024+image_num+".jpg")
    out = out_image + image_num + ".jpg"

    blank_image.paste(image64, (0,0)).paste(fluid128, (400,0)).paste(fluid512, (0,300)).paste(fluid1024, (400,300)).save(out)

Neden çalışmadığından emin değil. Hatayı alıyorum:

Traceback (most recent call last):
  File "C:\Users\Casey\Desktop\Image_composite.py", line 24, in <module>
    blank_image.paste(image64, (0,0)).paste(fluid128, (400,0)).paste(fluid512, (
ste(fluid1024, (400,300)).save(out)
AttributeError: 'NoneType' object has no attribute 'paste'
shell returned 1

Herhangi bir yardım harika olurdu. Teşekkürler!


25
2017-12-31 01:02


Menşei




Cevaplar:


Tek sorun, "yapıştırma" nın bir görüntü nesnesini döndürmemesidir - bu, "boş" görüntüyü yerinde değiştirir.

Yani, ikinci macun çağrıldığında (fuild128 görüntüsünü kullanan), "Yok" da uygulanmaya çalışır - bu, ilk görüntünün dönüş değeridir.

Bu sahip olduğunuz tek sorun buysa, satır başına yalnızca bir kez yapıştırma çağrısı yapın;

blank_image.paste(image64, (0,0))
blank_image.paste(fluid128, (400,0))
blank_image.paste(fluid512, (0,300))
blank_image.paste(fluid1024, (400,300))
blank_image.save(out)

Her görüntüyü, biçimlerinin de eşleşmesi için ölçeklendirmeniz gerekeceği muhtemel görünüyor. Ve "image_num" değişkeninin kodunuz gereksizdir. Python dizelerle gerçekten çok iyi - sadece böyle bir şey yapın:

image64 = Image.open(fluid64 + "%02d.jpg" % pic)

38
2017-12-31 01:15





Çizgiler boyunca bir şey kullanmak isteyebilirsiniz:

blank_image = Image.new("RGB", (800, 600))

Bu, resminizi oluşturabileceğiniz yeni bir alan yaratacaktır. Daha sonra, size görüntüleri yapıştırmanız gerekir.

O zaman daha sonra aşağıdakilerle tekrar kaydetmeniz gerekir:

blank_image.save("blank.jpg")

10
2017-12-31 01:23



Bu, kodda "yanlış" olan şey değil - aynı zamanda ondan da faydalanmasına rağmen. - jsbueno
Evet, sonradan neyin gerçekten "yanlış" olduğunu fark ettim. İzlemeye baktım ve boş_image doğru tanımlanmadı gibi görünüyordu. Bu yüzden sadece varsayımlar yaptım. Sonuçta burada oldukça geç kalıyor :) - David Hewitt
Benim kullanım durumum, dinamik bir boyutla yeni bir görüntü oluşturmak, parçaları yeni boş görüntüyle birleştirerek, bu çok yardımcı oldu. +1 - Clint Powell


Hata mesajını oku:

AttributeError: 'NoneType' object has no attribute 'paste'

Bu aramayı denediğiniz anlamına geliyor .paste türden bir şey üzerinde NoneTypeyani None nesne.

Image.paste Hiçbiri döndürmez. Fonksiyonları özel olarak destekleyecek şekilde tasarlandığı durumlar dışında, birlikte "zincirleme" yapamazsınız. Image.paste değil. (Bu tür bir şey için destek, işlevi yerine getirerek gerçekleştirilir. return self. Hakkında konuşacak bir hata var NoneType çünkü işlev hiçbir şey döndürmemek için yazılır ve Python'daki her şey geri döner None varsayılan olarak hiçbir şey açık bir şekilde iade edilmezse.) Bu Pythonic olarak kabul edilir: yöntemler yeni bir değer döndürür veya değiştirir self ve dönüş None. Bu nedenle, işlevlerin yan etkileri olduğunda "akıcı arayüzler" olarak adlandırılanlar kullanılmaz - Pythonistalar bunun zararlı olduğunu düşünür. Geri dönen None Bu fonksiyonun yan etkileri olduğu uyarısıdır. :)

Sadece dört ayrı yap .paste çağırır.


4
2017-12-31 04:59





PIL API'larının aksine copy, crop, resize veya rotate hangi dönmek Image nesne, paste döner None zincirleme yöntem çağrılarını engeller. Çok uygun değil API tasarımı.


1
2018-04-19 03:06





2-by-2 bir ızgarada fayans figürleri ile elde etmek kolay olurdu append_images Bu cevapta tanımlanan işlev https://stackoverflow.com/a/46623632/8738113

Örneğin:

img1 = append_images([image64, image128], direction='horizontal')
img2 = append_images([image512, image1024], direction='horizontal')
final = append_images([img1, img2], direction='vertical')
final.save("Fluid_all/00.jpg")

0
2017-10-09 17:15