Sorry, stupid typo in sizeToMax in the one I sent previously.  Sorry for the
attachments.

Kevin.

----- Original Message ----- 
From: <[EMAIL PROTECTED]>
To: "Nand Rathi" <[EMAIL PROTECTED]>; "python_ImageSig"
<[email protected]>
Sent: Sunday, December 04, 2005 2:00 PM
Subject: Re: [Image-SIG] Please,I need help regarding displaying a PIL image
in realtime...


> This question seems to come up regularly - so here's a quick and dirty
class
> that should work for displaying in Tkinter (cross-platform, although I've
> only tested on Windows).
>
> Kevin.
>
>
>
> ----- Original Message ----- 
> From: "Nand Rathi" <[EMAIL PROTECTED]>
> To: "python_ImageSig" <[email protected]>
> Sent: Saturday, December 03, 2005 2:47 PM
> Subject: [Image-SIG] Please,I need help regarding displaying a PIL image
in
> realtime...
>
>
> Hello All
>
>
>
> I am new to PIL so I apolozize in advance if what I
> ask is irrelevant to PIL. I am working with Python
> 2.4, PIL 1.1.5 in RH Linux and winXP environment.
>
>
>
> My application is collecting realtime data from
> multiple sensors. The data samples arrive on an
> average every 6 to 8 seconds. I need to plot the
> sensor data in realtime for viewing.
>
>
>
> I can use PIL beautifully to create the Images etc of
> the data and also can manipulate the image with the
> fresh arival of sensor data. The problem is viewing or
> displaying the image in realtime.
>
>
>
> File based viewing is inappropraite as well as slow
> here. Image.show method is also inappropriate as it
> will spawn an external process every 6 seconds or so.
> Too slow. In my opinion, what I require is a bitmapped
> graphics capable of rendering a PIL image in realtime
> with a refresh method which can be used to display the
> fresh arrived sensor data. There is a mention of an
> img package by Jack Jensen for X display in PIL
> handbook, but I couldn't locate the package via
> Google.
>
>
>
> Please help me with the direction here. Is there any
> other Python package which will fit the solution? I am
> also open to consider an alternative solution, as long
> as it will allow me realtime plotting of the data.
>
>
>
> I appreciate any help or guidance in this regard.
>
>
>
> regards
>
> Nand
>
>
>
> __________________________________________
> Yahoo! DSL - Something to write home about.
> Just $16.99/mo. or less.
> dsl.yahoo.com
>
> _______________________________________________
> Image-SIG maillist  -  [email protected]
> http://mail.python.org/mailman/listinfo/image-sig
>
>
>


----------------------------------------------------------------------------
----


> _______________________________________________
> Image-SIG maillist  -  [email protected]
> http://mail.python.org/mailman/listinfo/image-sig
>
# showTk.py
#
# by Kevin Cazabon, Dec 2005
# [EMAIL PROTECTED]

import Image, Tkinter, ImageTk

def sizeToMax(im, maxSize):
    imAspect = float(im.size[0])/float(im.size[1])
    outAspect = float(maxSize[0])/float(maxSize[1])

    if imAspect >= outAspect:
        #set to maxWidth x maxWidth/imAspect
        return im.resize((maxSize[0], int((float(maxSize[0])/imAspect) + 0.5)), 
Image.BICUBIC)
    else:
        #set to maxHeight*imAspect x maxHeight
        return im.resize((int((float(maxSize[1])*imAspect) + 0.5), maxSize[1]), 
Image.BICUBIC)
    

class showTk:
    def __init__(self, parent = None, im = None, maxSize = None):
        # show an image in a Tk window.  This can be part of a Tk GUI, or 
stand-alone.
        
        # parent = None or a Tk window that's already made
        # im = a filename or an open PIL image
        # maxSize = tuple of maximum horiz/vertical size for the display
        
        # create the main window as a Tk() or TopLevel()
        if parent == None:
            self.main = Tkinter.Tk()
            self.mainloopRequired = True
        else:
            self.main = Tkinter.Toplevel(parent)
            self.mainloopRequired = False
            
        self.maxSize = maxSize
    
        self.label = Tkinter.Label(self.main)
        self.label.pack()
        
        if im != None:
            self.update(im, maxSize)
            
    def mainloop(self):
        if self.mainloopRequired:
            self.main.mainloop()
        
    def update(self, im = None, maxSize = None):
        # update the image to a new one
        # im = a filename or an open PIL image, or None to blank it out
        # maxSize = tuple of maximum horiz/vertical size for the display
        
        # if a filename is passed in, open the image file
        if type(im) == type("string"):
            try:
                im = Image.open(im)
            except Exception, reason:
                return False, "Could not open image: %s" %reason
        
        # size the image if required - default to the maxSize given at init if 
not over-ridden
        if self.maxSize != None and maxSize == None:
            maxSize = self.maxSize
            
        if maxSize != None and im != None:
            try:
                im = sizeToMax(im, maxSize)
            except Exception, reason:
                return False, "Could not resize image to maxSize: %s" %reason
            
        
        # delete the current image so there's no resource conflict
        self.label.configure(image = None)
        self.label.update_idletasks()
        
        # update the display with a new image
        if im != None:
            try:
                self.im = ImageTk.PhotoImage(im)
            except Exception, reason:
                return False, "Could not make PhotoImage of im: %s" %reason
            
            self.label.configure(image = self.im)
            
            self.label.update_idletasks()
        
        return True, "Update OK"

        
     
if __name__ == "__main__":
    import time
    
    window = showTk(im = "c:\\temp\\test.tif", maxSize = (400,600))
    
    time.sleep(5)    # window will block during sleep, sorry
    window.update(im = "c:\\temp\\test2.tif")
    
    window.mainloop()    # you have to call this if it's the main GUI window,
                        # so it enters the local event processing loop, but
                        # it's safe to call in any circumstance.
    
        
        
_______________________________________________
Image-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/image-sig

Reply via email to