2013-07-09 68 views
3

我沒有python的經驗,但該腳本的所有者沒有響應。在python中創建圖片的蒙太奇

當我通過此腳本拖動我的照片創建一個蒙太奇時,它會切斷右側邊緣上最後一張照片的一半。廣

爲4張的圖片,

1 2 3 4 

5 6 7 8 

圖片4,8通常會得到減半。圖片的空間(它的空白雖然)

我想知道什麼會造成這種情況。

我認爲它有可能是裁剪,但它幾乎像一半的圖片不導入或檢測。

那麼,你將選定照片上的腳本,它輸出這樣的事情 http://i.imgur.com/PzNylbV.png

所以,你可以拿一把的照片或截圖,並把它們合併成一個單一的文件,反而容易增加每張照片個別。

每張照片的尺寸最大爲500x250。

enter image description here

編輯: 這裏是預覽上傳,正如你所看到的圖像具有插槽,但他們「消失」如果是有道理的。

編輯2: 這個腳本一次工作,我沒有編輯它或任何東西。它曾經在〜70截圖蒙太奇。沒有錯誤或任何東西。我的電腦可以做些什麼來破壞圖像的導入?

#!/usr/bin/env python 
import os 
import sys 
from time import strftime 
import Image 
import ImageDraw 
import ImageFont 

# parameters 
row_size = 4 
margin = 3 

def generate_montage(filenames): 
    images = [Image.open(filename) for filename in filenames] 

    width = 0 
    height = 0 
    i = 0 
    sum_x = max_y = 0 
    width = max(image.size[1]+margin for image in images)*row_size 
    height = sum(image.size[0]+margin for image in images) 

    montage = Image.new(mode='RGBA', size=(width, height), color=(0,0,0,0)) 
    try: 
     image_font = ImageFont.truetype('font/Helvetica.ttf', 18) 
    except: 
     try: 
      image_font = ImageFont.load('font/Helvetica-18.pil') 
     except: 
      image_font = ImageFont.load_default() 
    draw = ImageDraw.Draw(montage) 
    offset_x = offset_y = 0 

    i = 0 
    max_y = 0 
    max_x = 0 
    offset_x = 0 
    for image in images: 
     montage.paste(image, (offset_x, offset_y)) 

     text_coords = offset_x + image.size[0] - 45, offset_y + 120 
     draw.text(text_coords, '#{0}'.format(i+1), font=image_font) 

     max_x = max(max_x, offset_x+image.size[0]) 
     if i % row_size == row_size-1: 
      offset_y += max_y+margin 
      max_y = 0 
      offset_x = 0 
     else: 
      offset_x += image.size[0]+margin 
      max_y = max(max_y, image.size[1]) 

     i += 1 

    if i % row_size: 
     offset_y += max_y 

    filename = strftime("Montage %Y-%m-%d at %H.%M.%S.png") 
    montage = montage.crop((0, 0, max_x, offset_y)) 
    montage.save(filename) 

if __name__ == '__main__': 
    old_cwd = os.getcwd() 

    os.chdir(os.path.dirname(sys.argv[0])) 
    try: 
     if len(sys.argv) > 1: 
      generate_montage(sys.argv[1:]) 
    finally: 
     os.chdir(old_cwd) 
+0

我們需要更多的信息:1)這個腳本的目的是什麼? 2)你投入了多大尺寸的圖像? 3)你能告訴我們一個輸入和輸出的截圖嗎?不知道這個腳本應該做什麼,很難確定如何解決它。如果您使用適當的詳細信息編輯問題,則此問題將移至審覈隊列中以重新打開。 –

+0

應該有你要求的所有信息。不知道我還能怎麼說呢。感謝您幫助我提供所需的內容。 – user2565679

回答

4

在大小計算,使用image.size[1]的寬度,但是這是高度!改爲使用image.size[0]代替寬度,使用image.size[1]代替。

此外,一對夫婦的未成年人文體筆記:

  • 你真正需要的腳本總是從程序的目錄中運行?在任何情況下,os.chdir(os.path.dirname(sys.argv[0]))都會阻止程序作爲./montage.py執行,因此您可能希望使用abspath來允許從當前目錄進行調用。
  • 而不必更新計數器i的,您可以循環改變到

    for i,image in enumerate(images): 
    
  • 以下行沒有任何效果,因爲變量覆蓋/從未使用過:

    width = 0 
    height = 0 
    i = 0 
    sum_x = max_y = 0 
    

總而言之,代碼可能如下所示:

#!/usr/bin/env python 
import os.path 
import sys 
from time import strftime 
import Image 

row_size = 4 
margin = 3 

def generate_montage(filenames, output_fn): 
    images = [Image.open(filename) for filename in filenames] 

    width = max(image.size[0] + margin for image in images)*row_size 
    height = sum(image.size[1] + margin for image in images) 
    montage = Image.new(mode='RGBA', size=(width, height), color=(0,0,0,0)) 

    max_x = 0 
    max_y = 0 
    offset_x = 0 
    offset_y = 0 
    for i,image in enumerate(images): 
     montage.paste(image, (offset_x, offset_y)) 

     max_x = max(max_x, offset_x + image.size[0]) 
     max_y = max(max_y, offset_y + image.size[1]) 

     if i % row_size == row_size-1: 
      offset_y = max_y + margin 
      offset_x = 0 
     else: 
      offset_x += margin + image.size[0] 

    montage = montage.crop((0, 0, max_x, max_y)) 
    montage.save(output_fn) 

if __name__ == '__main__': 
    basename = strftime("Montage %Y-%m-%d at %H.%M.%S.png") 
    exedir = os.path.dirname(os.path.abspath(sys.argv[0])) 
    filename = os.path.join(exedir, basename) 
    generate_montage(sys.argv[1:], filename) 
+0

謝謝,我會在我到家時嘗試編輯。我沒有寫這篇文章,只有很少的C++知識(大學初學者),所以這對我來說都是一個學習的東西。我很欣賞這種迴應。我會再次檢查,讓你知道一切如何解決。 – user2565679

+0

這並沒有結束工作。我在頂部添加了另一張圖片。看起來所有的測量結果都是正確的,但圖片似乎「正在消失」 – user2565679

+0

@ user2565679你可以在此答案中發佈結果和源代碼圖片嗎? – phihag