2013-03-05 59 views
3

我是一個python新手,並且已經制作了一個有點奇怪的幻燈片腳本,它可以循環顯示圖像,並且還可以從另一個文件中獲取變量來「解決」圖像。使用Python在屏幕上的圖像之間淡出使用Python TKinter/imageTK

我確定我的代碼是悲劇性的。但它確實有效(見下文)!

我的問題是 - 我如何讓它在圖像之間褪色而不是生澀暫時去白色然後到它目前的下一個圖像?是否有我應該看的轉換模塊?

from Tkinter import * 
import Image, ImageTk, random, string 

class MyApp(Tk): 

def __init__(self): 
    Tk.__init__(self) 
    fr = Frame(self) 
    fr.pack() 
    self.canvas = Canvas(fr, height = 400, width = 600) 
    self.canvas.pack() 

    self.old_label_image = None 
    self.position = 0 
    self.command = 0 
    self.oldcommand = 0 

    self.slideshow() 
    self.debug() 

def debug(self): 
    self.QUIT = Button(self) 
    self.QUIT["text"] = "QUIT!" + str(self.command) 
    self.QUIT["fg"] = "red" 
    self.QUIT["command"] = self.quit 

    self.QUIT.pack({"side": "right"}) 

def slideshow (self): 

    if self.command != self.oldcommand: 
     self.after_cancel(self.huh) 
     # run through random between 2-5 changes 
     # then settle on command for 30 seconds 
     self.title("Title: PAUSE") 
     self.oldcommand = self.command 
     self.slideshow() 
    else: 
     file = str(self.position) + '.jpg' 
     image1 = Image.open(file) 
     self.tkpi = ImageTk.PhotoImage(image1) 
     label_image = Label(self, image=self.tkpi) 
     label_image.place(x=0,y=0,width=image1.size[0],height=image1.size[1]) 
     self.title("Title: " + file) 

     if self.old_label_image is not None: 
      self.old_label_image.destroy() 
     self.old_label_image = label_image 

     # make this random instead of pregressional 
     if self.position is not 1: 
      self.position = self.position + 1 
     else: 
      self.position = 0 

     commandfile = open('command.txt', 'r') 
     self.command = string.atoi(commandfile.readline()) 
     commandfile.close() 

     int = random.randint(2000, 5000) 
     self.huh = self.after(int, self.slideshow) 
     #self.after_cancel(huh) - works ! so maybe can do from below Fn? 

if __name__ == "__main__": 
root = MyApp() 
root.mainloop() 
+0

你能提供的「命令。文本'?沒有這個,我無法測試你的代碼。我試圖刪除它,但我只看到藍色背景不是我的JPG圖像 – CoppolaEmilio 2013-12-24 16:14:34

回答

2

這可以使用混合函數來實現。

Image.blend(image1, image2, alpha) ⇒ image 

由給定的圖像之間進行內插,使用恆定的α創建一個新的圖像。這兩個圖像必須具有相同的大小和模式。

out = image1 * (1.0 - alpha) + image2 * alpha 

如果alpha爲0.0,則返回第一個圖像的副本。如果alpha爲1.0,則返回第二個圖像的副本。 Alpha值沒有限制。如有必要,結果將被剪裁以適合允許的輸出範圍。

所以,你可以有這樣的事情:

alpha = 0 
while 1.0 > alpha: 
    image.blend(img1,img2,alpha) 
    alpha = alpha + 0.01 
    label_image.update() 

一個例子是在這裏,沒有帶過的時間來測試這一點,但你得到的idea-

from PIL import image 
import time 
white = image.open("white_248x.jpg") 
black = image.open("black_248x.jpg") 
new_img = image.open("white_248x.jpg") 
root = Tk() 
image_label = label(root, image=new_img) 
image_label.pack() 
alpha = 0 
while 1.0 > alpha: 
    new_img = image.blend(white,black,alpha) 
    alpha = alpha + 0.01 
    time.sleep(0.1) 
    image_label.update() 
root.mainloop() 
+0

謝謝 - 這是在一個非常及時的時刻:-)你有一個腳本這樣做的例子嗎? – Staple 2014-06-17 21:27:17

+0

這是在底部的原始問題 - 我已編輯它:) – 2014-06-18 22:10:34