2010-03-22 28 views
5

Estoy tratando con los almacenamientos intermedios de imágenes, y quiero poder acceder a los datos unas pocas líneas en mi imagen para analizarlas con una biblioteca c. Creé mi memoria intermedia de píxeles de 8 bits en Python usando create_string_buffer. ¿Hay alguna manera de obtener un puntero a una ubicación dentro de ese búfer sin volver a crear un nuevo búfer? Mi objetivo es analizar y cambiar datos en ese buffer en fragmentos, sin tener que hacer una gran cantidad de creación de buffer y copia de datos.ctypes y manipulación de punteros

En este caso, en última instancia, la biblioteca C está haciendo toda la manipulación del búfer, por lo que en realidad no tiene que cambiar los valores dentro del búfer utilizando Python. Solo necesito darle acceso a mi función C a los datos dentro del buffer.

Respuesta

8

create_string_buffer le da un objeto ctypes (un conjunto de caracteres) y, a continuación byref, y cito,

devuelve un puntero de peso ligero a OBJ, que debe ser una instancia de una ctypes tipo . el valor predeterminado es cero y debe ser un número entero que se agregará al valor del puntero interno.

El argumento offset se ha añadido en 2.6, así que si le pegan con una versión más antigua que se necesita más trabajo por desgracia.

+0

Una cosa que es un poco confuso, aunque-- Supongamos que hago lo siguiente: "buff = create_string_buffer (10)". ¿Pasará "byref (buff, 3)" pass "& (buff [3])" or "(& buff) + 3)"? – Chris

+0

@Chris, las dos expresiones son equivalentes - en C, '& X [Y] == X + Y' es una tautología para cualquier puntero X (arrays" decay to "punteros en C) y entero Y. (Aquí, el los elementos de la matriz son de 1 byte cada uno, por lo que no puede haber ninguna duda acerca de "escalar" en la aritmética del puntero ;-). –

+0

Me doy cuenta de que son equivalentes en C, pero no estaba seguro de cómo responderían los ctypes ... en otras palabras, ¿pasaría el puntero incrementado en 3, o un puntero a la instancia de pitón incrementado en tres, o algo raro como ese. Como siempre, sin embargo, Python es inteligente y pasa el puntero C incrementado en tres. ¡Gracias por la ayuda! – Chris

0

También puede utilizar ctypes.cast(buf, ctypes.c_void_p)

+0

No parece que me permita establecer un desplazamiento en el búfer. ¿Me he perdido algo? – Chris