tags:

views:

142

answers:

2

I am dealing with image buffers, and I want to be able to access data a few lines into my image for analysis with a c library. I have created my 8-bit pixel buffer in Python using create_string_buffer. Is there a way to get a pointer to a location within that buffer without re-creating a new buffer? My goal is to analyze and change data within that buffer in chunks, without having to do a lot of buffer creation and data copying.

In this case, ultimately, the C library is doing all the manipulation of the buffer, so I don't actually have to change values within the buffer using Python. I just need to give my C function access to data within the buffer.

+2  A: 

create_string_buffer gives you a ctypes object (an array of chars), then byref, and I quote,

Returns a light-weight pointer to obj, which must be an instance of a ctypes type. offset defaults to zero, and must be an integer that will be added to the internal pointer value.

The offset argument has been added in 2.6, so if you're stuck with an older version you will unfortunately need more work.

Alex Martelli
Perfect! I had missed that. Thanks!
Chris
Chris
@Chris, the two expressions are equivalent -- in C, `-).
Alex Martelli
I realize they are equivalent in C, but I wasn't sure how ctypes would respond... in other words, would it pass the pointer incremented by 3, or a pointer to the python instance incremented by three, or something weird like that. As usual, though, python is smart and passes the C pointer incremented by three. Thanks for the help!
Chris
A: 

You can also use ctypes.cast(buf, ctypes.c_void_p)

Shane Holloway
That doesn't look like it lets me set an offset into the buffer. Did I miss something?
Chris