es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cython: Pasando una imagen sin procesar desde python a una librería externa de C++

Lo que estoy tratando de hacer es cargar una imagen png usando el programa de Python, pasar los datos binarios sin procesar a C++ para modificarlos y devolverlos al programa de Python. Actualmente estoy utilizando Cython como forma de acceder al archivo .dll de C++, sin embargo, tengo un problema para pasar la imagen.

El código pasa correctamente y devuelve cadenas y enteros hacia y desde C++, pero no puedo pasar el archivo de imagen completo (sin procesar). Intenté volver a unir los archivos en el lado de C++, pero no parece funcionar, solo se pasan los primeros bytes y se escriben en el lado de C++. Esto es lo que obtuve de la terminal en el lado de C++: �PNG, y esto es lo que devolvió al script de Python: \x89PNG\r\n\x1a\n.

Según mi comprensión, estoy bastante seguro de que el problema radica en la conversión de ctype de Cython o en el lado de los parámetros de C++. No estoy seguro de si estoy usando correctamente unsigned char*, pero según entiendo, C++ no tiene un tipo “byte” y un unsigned char debería funcionar. ¿Si unsigned char* no es lo mismo que “byte”, qué debo poner en el parámetro para el método de C++?

Python:

image = ""

# abrir la imagen
with open("image.png", "rb") as s:
    image = s.read()

# configurar el tipo de retorno
lib.input.restype = ctypes.c_char_p

# llamar al método de C++
reply = lib.input(image)

# imprimir la respuesta
print(f'esta es la respuesta {reply}')

C++
unsigned char* input(unsigned char* input)
{
   // imprimir la entrada
   std::cout << input << std::endl;
   return input;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un problema al pasar el archivo de imagen completo (en crudo) desde Python a C++ utilizando Cython. Mientras que las cadenas de texto y los enteros se pasan correctamente, solo se pasan y escriben en el lado de C++ los primeros bytes del archivo de imagen.

    La fuente del problema podría estar relacionada con la conversión de tipos de datos de Cython o con el lado del parámetro de C++, específicamente con el uso de unsigned char*. Es posible que unsigned char* no se esté utilizando correctamente, ya que C++ no tiene un tipo de dato “byte” y un unsigned char debería funcionar.

    Para resolver el problema, puede ser necesario revisar el parámetro del método en C++. Es posible que sea necesario utilizar un tipo de dato diferente, o un enfoque distinto, para pasar el archivo de imagen a C++ y recibir de vuelta el archivo modificado.

    En el código de Python, se carga y lee el archivo de imagen como una cadena de texto en memoria. Se establece el tipo de retorno como ctypes.c_char_p y se llama al método de C++ input() con la cadena de imagen como argumento. El valor devuelto se imprime en pantalla.

    En el código de C++, la función input() imprime y devuelve el valor de entrada tal como es. Puede haber algunos problemas aquí en cuanto a cómo se manejan los datos de la imagen, ya que solo se pasan los primeros bytes.

    Podría ser necesario realizar una investigación y depuración adicionales para resolver el problema de pasar los datos de la imagen de Python a C++ utilizando Cython.

Comments are closed.