[Bf-python] Blender.Image Function

Austin Benesh doccoaster at msn.com
Tue Feb 22 01:55:15 CET 2005


Thank You! What a pain this has been. I'll post the patch when I've got it
written.

-----Original Message-----
From: bf-python-bounces at projects.blender.org
[mailto:bf-python-bounces at projects.blender.org] On Behalf Of joeedh
Sent: Monday, February 21, 2005 12:31 PM
To: Blender Foundation Python list
Subject: Re: [Bf-python] Blender.Image Function

Ok, here's what I know:

Each pixel channel (R,B,G,A) is one byte, this is why ->rect is an int* 
, since the four channels combine themselves into one four-byte integer.

So basically, to get a pixel from an image all you have to do is to find 
it's one-dimensional array indice (which I can't remember the formula 
for), then to get the actual color data you cast to a char*.

So, basically the code would be:

char *pixel = (char *) image->rect[some_indice];
return Py_BuildValue("[f,f,f]", ((float)pixel[0])/255, 
((float)pixel[1])/255, ((float)pixel[2])/255);

Remember that it's usually the most convienent to return float colors 
that range between 0 and 1, so to do that you simply divide the color by 
255 (but casting to a float first, *very* important).

HOWEVER: big-endian OS's like OSX may require you to switch the ordering 
of the bytes in the integer. Look at the imbuf code to figure out how to 
do this, and if it's necassary :) .

joeedh

Austin Benesh wrote:

>Ok, but I need help figuring out how to actually access the pixels in the
>Imbuf->rect function. Does anyone know how I might do this? Here's the
code.
>Please tell me what's wrong!
>
>static PyObject *Image_getPixels_g(BPy_Image * self, PyObject *args)
>{
>	PyObject *pyObjImage;
>	PyObject *attr;
>	BPy_Image *py_img;
>	Image *image=self->image;
>	unsigned int u;
>	unsigned int p;
>	int ptr;
>	int x=0;
>	int y=0;
>
>	if( !PyArg_ParseTuple( args, "ii", &x, &y ) )
>		return EXPP_ReturnPyObjError( PyExc_TypeError,
>					      "expected 2 integers" );
>	
>//	py_img = ( BPy_Image * ) self;
>//	image = py_img->image;
>
>	if( !image->ibuf||!image->ibuf->rect )	/* if no image data
>available */
>		load_image( image, IB_rect, "", 0 );	/* loading it */
>		
>	if( !image->ibuf||!image->ibuf->rect )	/* didn't work */
>		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
>					      "couldn't load image data in
>Blender" );
>
>	ptr=(x + y * image->ibuf->x);
>
>	attr = Py_BuildValue( "h", image->ibuf->rect[ptr+1] );
>// testing section	
>//	
>	
>
>	
>
>	if( attr )
>		return attr;
>
>	return EXPP_ReturnPyObjError( PyExc_RuntimeError,
>				      "couldn't get Image.depth attribute"
>);
>};
>
>-----Original Message-----
>From: bf-python-bounces at projects.blender.org
>[mailto:bf-python-bounces at projects.blender.org] On Behalf Of Stephen Swaney
>Sent: Sunday, February 20, 2005 5:58 PM
>To: Blender Foundation Python list
>Subject: Re: [Bf-python] Blender.Image Function
>
>On Sun, Feb 20, 2005 at 05:01:21PM -0700, Austin Benesh wrote:
>  
>
>>I am writing a patch that many people say is needed – it adds three new
>>functions to Blender.Image: 
>>
>>getPixelColor_G(x, y)
>>
>>getPixelColor_R(x, y)
>>
>>getPixelColor_B(x, y)
>>    
>>
>
>In my not-so-humble opinion, a nicer and slightly more OO
>interface would be to provide a single method that returns
>a list of the values:
>
>r,g,b = getPixelColor( x, y )
>
>This would be nicer for treating the pixel as a vector in color
>space.  And much less typing and overhead than:
>
>r = getP_R..
>g = getP_G..
>b = getP_B..
>
>If you don't want the extra values, you can always toss
>them:
>
>junk, g, junk = getPixelColor()
>
>But opinions may vary.  Let the debate begin!
>
>  
>

_______________________________________________
Bf-python mailing list
Bf-python at projects.blender.org
http://projects.blender.org/mailman/listinfo/bf-python



More information about the Bf-python mailing list