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.

Guardar textura de OpenGLES en archivo PNG

Pude crear una textura OpenGL desde QImage con un código como este:

    QImage qImage(file_name);

    qImage = qImage.mirrored().convertToFormat(QImage::Format_ARGB32);

    GLuint Id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(target, level, GL_RGBA, qImage.width(), qImage.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, qImage.bits());

donde file_name es un archivo JPG o PNG.

Ahora estoy buscando una forma de crear QImage a partir de una textura para poder guardarlo en un archivo PNG con QImage::save.

Teóricamente puedo crear QImage con su constructor

QImage::QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)

pero no está claro cómo acceder a los datos de la textura.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en qt y qt6, puedes crear una QImage a partir de una textura utilizando glGetTexImage() para recuperar los datos de la textura y luego pasar estos datos al constructor de QImage. Aquí hay un ejemplo de código:

    GLuint textureId = 123; // reemplaza con tu ID de textura actual
    GLint textureWidth = 512; // reemplaza con el ancho de textura actual
    GLint textureHeight = 512; // reemplaza con el alto de textura actual
    
    // asignar memoria para recibir datos de textura
    GLubyte* textureData = new GLubyte[textureWidth * textureHeight * 4];
    
    // recuperar datos de textura en textureData
    glBindTexture(GL_TEXTURE_2D, textureId);
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);
    
    // crear QImage a partir de datos de textura
    QImage qImage(textureData, textureWidth, textureHeight, QImage::Format_RGBA8888, nullptr, nullptr);
    
    // guardar QImage en archivo
    qImage.save("output.png");
    
    // liberar memoria de datos de textura
    delete[] textureData;
    

    En este ejemplo, textureId, textureWidth y textureHeight deben ser reemplazados por su ID de textura, ancho y alto reales, respectivamente. La función glGetTexImage() se usa para recuperar los datos de la textura en un búfer asignado por new. Luego, el búfer se pasa al constructor de QImage junto con el ancho, alto y formato de los datos de textura. Finalmente, la QImage se guarda en un archivo utilizando el método save() y se libera el búfer de datos de textura utilizando delete[].

Comments are closed.