Gabriel Genellina
12/30/2007 7:58:00 AM
On 29 dic, 12:42, jimgarde...@gmail.com wrote:
> am a beginner in python and PIL .I need to read an RGB 8 bit image
> (am using jpeg )and pack the rgb color values into a double value so i
> can store the image as a list of pixelvalues.From my application i
> should be able to call rgbimage1.getpixellist() to retrieve the double
> values of an image.
(May I ask why an accessor like getpixellist() instead of simply
rgbimage1.pixellist?)
> Do i need to create a new class for this?I made something like
>
> class myrgbimage:
> def __init__(self,filename):
>
> def _readimage(self):
> im=Image.open(filename)
> self._readImage(filename)
> self._wd,self._ht=im.size
> for y in range(self._ht):
> for x in range(self._wd):
> r,g,b=im.getpixel((x,y))
> pval=self.rgbTodoubleval((r,g,b))
> self._pixellist.append(pval)
The PIL docs at [1] say that using getpixel is very slow, and suggest
to use getdata instead. And you want a flat representation anyway,
just like getdata. So replace the for loops above with:
rgbTodoubleval = self.rgbTodoubleval
self._pixellist = [rgbTodoubleval(pix) for pix in
im.getdata()]
I've not tested it, but should be faster.
> def rgbTodoubleval(self,(r,g,b)):
> alpha=255
> pixelvalue=(alpha<<24)|(r<<16 )|( g<<8) | b
> return pixelvalue
I don't get the name - why "rgb to double"? This does not return a
"double", but a long integer, even if you intended to return a 32 bit
integer.
This version returns an integer:
from struct import pack, unpack
def rgbTodoubleval((r,g,b)):
alpha=255
return unpack("l", pack("BBBB", b, g, r, alfa))[0]
It *may*, or not, be what you want...
--
Gabriel Genellina