Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > wxPython: images from URLs

Reply
Thread Tools

wxPython: images from URLs

 
 
Jonathan Daugherty
Guest
Posts: n/a
 
      01-26-2004
Does anyone here know if the wxImage class in wxPython supports dislaying
images from URLs?

--

Jonathan Daugherty
http://www.cprogrammer.org

"It's a book about a Spanish guy called Manual, you should read it."
-- Dilbert

 
Reply With Quote
 
 
 
 
Kevin Altis
Guest
Posts: n/a
 
      01-26-2004
"Jonathan Daugherty" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Does anyone here know if the wxImage class in wxPython supports dislaying
> images from URLs?


Yes, the trick is to use StringIO to convert the data rather than saving to
a file and loading it from disk. Here's a concrete example...

ka
---

import urllib
from wxPython import wx
from cStringIO import StringIO

# I'll assume you already have an app, frame...
# to draw into if that's what you want to do

wx.wxInitAllImageHandlers()

# here's a real URL for testing purposes
url = 'http://pythoncard.sourceforge.net/images/addresses_01.png'

try:
fp = urllib.urlopen(url)
data = fp.read()
fp.close()
img = wx.wxImageFromStream(StringIO(data))
except:
# decide what you want to do in case of errors
# there could be a problem getting the data
# or the data might not be a valid jpeg, png...
pass

# now you can do whatever you want with the image


 
Reply With Quote
 
 
 
 
Tim Roberts
Guest
Posts: n/a
 
      01-28-2004
Jonathan Daugherty <(E-Mail Removed)> wrote:
>
>Does anyone here know if the wxImage class in wxPython supports dislaying
>images from URLs?


wxImage will read from a file or from a wxWindows stream. It won't
download from a web site, but that's trivially easy using something like
urllib.
--
- Tim Roberts, http://www.velocityreviews.com/forums/(E-Mail Removed)
Providenza & Boekelheide, Inc.
 
Reply With Quote
 
Anand Pillai
Guest
Posts: n/a
 
      01-28-2004
I have written some code for this in my PyWiew application
which allows one to open image urls directly.

Copying some relevant code from the application...

self._imgstream = urllib2.urlopen(url).read()
stream=cStringIO.StringIO(self._imgstream)

try:
img=wxImageFromStream(stream)
except:
pass

In short you do the following.

1. Use urllib or urllib2 to open the image data stream
2. Make a cStringIO string buffer from the data stream
3. Pass it to "wxImageFromStream()" method to get the
wxImage object.
4. Display the image directly or by converting to
a suitable format using PIL.

In my experience I found that wxWindows tend to
display an error message window when the image is displayed
directly as a wxImage though the image data is quite ok.
(Something like a corrupt stream dialog). So what I have
done in the application is, use PIL to convert the wxImage
to Windows BMP format and then display it. This seems
to work for all images.

HTH.

-Anand



Tim Roberts <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>. ..
> Jonathan Daugherty <(E-Mail Removed)> wrote:
> >
> >Does anyone here know if the wxImage class in wxPython supports dislaying
> >images from URLs?

>
> wxImage will read from a file or from a wxWindows stream. It won't
> download from a web site, but that's trivially easy using something like
> urllib.

 
Reply With Quote
 
Jonathan Daugherty
Guest
Posts: n/a
 
      01-28-2004
# self._imgstream = urllib2.urlopen(url).read()
# stream=cStringIO.StringIO(self._imgstream)
#
# try:
# img=wxImageFromStream(stream)
# except:
# pass

I have tried this and it appears to work, but once I have
the image (from wxImageFromStream), I use it as follows:

try:
bm = wxBitmap(img)
self.bitmap.setBitmap(bm)
except Exception, e:
print e

And the exception (raised by wxBitmap(img)) is:

String or Unicode type required

(The exception is a TypeError exception.)

Any ideas? No exceptions are raised by the block that
creates the image from the data stream. The image is
a JPG image, and I pass wxBITMAP_TYPE_JPEG to
wxImageFromStream. I have also tried omitting it as
well.

--

Jonathan Daugherty
http://www.cprogrammer.org

"It's a book about a Spanish guy called Manual, you should read it."
-- Dilbert

 
Reply With Quote
 
Anand Pillai
Guest
Posts: n/a
 
      01-29-2004
This is the straight forward way to do this in wxPython
but somehow it always pops up that ugly error window.
I remember trying many options to do this purely using
wxPython (wxWindows), but I failed.

If you use PIL in your program you can conver the
wx Image instance to a PIL image of type BMP and then
display it by reconverting it back to the wxImage
instance. PyWiew has methods to do this. The source code
is available somewhere in my Python page at
http://members.lycos.co.uk/anandpillai . I no longer
maintain that program, but the latest source code should
be available there.

Regards

-Anand

Jonathan Daugherty <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> # self._imgstream = urllib2.urlopen(url).read()
> # stream=cStringIO.StringIO(self._imgstream)
> #
> # try:
> # img=wxImageFromStream(stream)
> # except:
> # pass
>
> I have tried this and it appears to work, but once I have
> the image (from wxImageFromStream), I use it as follows:
>
> try:
> bm = wxBitmap(img)
> self.bitmap.setBitmap(bm)
> except Exception, e:
> print e
>
> And the exception (raised by wxBitmap(img)) is:
>
> String or Unicode type required
>
> (The exception is a TypeError exception.)
>
> Any ideas? No exceptions are raised by the block that
> creates the image from the data stream. The image is
> a JPG image, and I pass wxBITMAP_TYPE_JPEG to
> wxImageFromStream. I have also tried omitting it as
> well.

 
Reply With Quote
 
Kevin Altis
Guest
Posts: n/a
 
      01-29-2004
"Anand Pillai" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed) m...
> I have written some code for this in my PyWiew application
> which allows one to open image urls directly.
>
> Copying some relevant code from the application...
>
> self._imgstream = urllib2.urlopen(url).read()
> stream=cStringIO.StringIO(self._imgstream)
>
> try:
> img=wxImageFromStream(stream)
> except:
> pass
>
> In short you do the following.
>
> 1. Use urllib or urllib2 to open the image data stream
> 2. Make a cStringIO string buffer from the data stream
> 3. Pass it to "wxImageFromStream()" method to get the
> wxImage object.
> 4. Display the image directly or by converting to
> a suitable format using PIL.
>
> In my experience I found that wxWindows tend to
> display an error message window when the image is displayed
> directly as a wxImage though the image data is quite ok.
> (Something like a corrupt stream dialog). So what I have
> done in the application is, use PIL to convert the wxImage
> to Windows BMP format and then display it. This seems
> to work for all images.
>
> HTH.
>
> -Anand
>
>
>
> Tim Roberts <(E-Mail Removed)> wrote in message

news:<(E-Mail Removed)>. ..
> > Jonathan Daugherty <(E-Mail Removed)> wrote:
> > >
> > >Does anyone here know if the wxImage class in wxPython supports

dislaying
> > >images from URLs?

> >
> > wxImage will read from a file or from a wxWindows stream. It won't
> > download from a web site, but that's trivially easy using something like
> > urllib.


In general you don't display a wxImage object directly. In wxWindows,
wxImage is the platform-independent image class and wxBitmap is the
platform-specific image class. So, when you set an image to be used with a
wxStaticBitmap or wxBitmapButton or draw to a wxDC you use a wxBitmap.
Certain image operations not yet supported by wxWindows are easier to handle
with PIL in which case your solution of keeping a working image in PIL
format and then converting a wxBitmap prior to display is also a good
solution. Conversion is covered in the wxPython wiki.

http://wiki.wxpython.org/

Here are some of the conversion routines PythonCard uses to deal with PIL,
wxImage, wxBitmap, and NumPy numeric arrays.

def PILToImage(pilImage):
if (pilImage.mode != 'RGB'):
pilImage = pilImage.convert('RGB')
imageData = pilImage.tostring('raw', 'RGB')
img = wx.wxEmptyImage(pilImage.size[0], pilImage.size[1])
img.SetData(imageData)
return img

def PILToBitmap(image):
return wx.wxBitmapFromImage(PILToImage(image))

def BitmapToPIL(bmp):
imageData = wx.wxImageFromBitmap(bmp).GetData()
imagePIL = fromstring('RGB', (bmp.GetWidth(), bmp.GetHeight()),
imageData)
imagePIL = imagePIL.convert('RGB')
return imagePIL

def numericArrayToImage(array):
height, width = array.shape[:2]
img = wx.wxEmptyImage(width, height)
img.SetData(array.tostring())
return img

ka


 
Reply With Quote
 
Tim Roberts
Guest
Posts: n/a
 
      01-30-2004
Jonathan Daugherty <(E-Mail Removed)> wrote:

># self._imgstream = urllib2.urlopen(url).read()
># stream=cStringIO.StringIO(self._imgstream)
>#
># try:
># img=wxImageFromStream(stream)
># except:
># pass
>
>I have tried this and it appears to work, but once I have
>the image (from wxImageFromStream), I use it as follows:
>
>try:
> bm = wxBitmap(img)
> self.bitmap.setBitmap(bm)
>except Exception, e:
> print e


Why wouldn't you use wxBitmapFromImage?
--
- Tim Roberts, (E-Mail Removed)
Providenza & Boekelheide, Inc.
 
Reply With Quote
 
Jonathan Daugherty
Guest
Posts: n/a
 
      01-30-2004
# Why wouldn't you use wxBitmapFromImage?

The api docs suggest that using the wxBitmap(image) constructor
is better. Besides: this is beside the point -- this code fails:

stream = cStringIO.StringIO(imgdata)
imgobj = wx.wxImage(stream)

The second line raises a TypeError: "String or Unicode type
required."

--

Jonathan Daugherty
http://www.cprogrammer.org

"It's a book about a Spanish guy called Manual, you should read it."
-- Dilbert

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
JDBC URLs ...not really URLs? Adam Monsen Java 11 02-08-2009 08:14 PM
Converting Relative URLs into Absolute URLs Nathan Sokalski ASP .Net 1 08-12-2008 07:03 AM
Automatically save images from image URLs Simon Wigzell ASP General 1 12-11-2007 06:41 PM
dynamic URLS convert to static URLS for search engines Steve T. ASP .Net Web Services 7 03-04-2004 03:16 PM
Distinguish text URLs from non-text URLs? Kaidi Java 5 01-04-2004 10:15 AM



Advertisments