I am trying to extract frames from a stream which I create with Gstreamer and trying to save them with FreeImage or QImage ( this one is for testing ).
    GstMapInfo bufferInfo;
    GstBuffer *sampleBuffer;
    GstStructure *capsStruct;
    GstSample *sample;
    GstCaps *caps;
    int width, height;
    const int BitsPP = 32;
    /* Retrieve the buffer */
    g_signal_emit_by_name (sink, "pull-sample", &sample);
    if (sample) {
        sampleBuffer = gst_sample_get_buffer(sample);
        gst_buffer_map(sampleBuffer,&bufferInfo,GST_MAP_READ);
        if (!bufferInfo.data) {
            g_printerr("Warning: could not map GStreamer buffer!\n");
            throw;
        }
        caps = gst_sample_get_caps(sample);
        capsStruct= gst_caps_get_structure(caps,0);
        gst_structure_get_int(capsStruct,"width",&width);
        gst_structure_get_int(capsStruct,"height",&height);
        auto bitmap = FreeImage_Allocate(width, height, BitsPP,0,0,0);
        memcpy( FreeImage_GetBits( bitmap ), bufferInfo.data, width * height * (BitsPP/8));
//        int pitch = ((((BitsPP * width) + 31) / 32) * 4);
//        auto bitmap = FreeImage_ConvertFromRawBits(bufferInfo.data,width,height,pitch,BitsPP,0, 0, 0);
        FreeImage_FlipHorizontal(bitmap);
        bitmap = FreeImage_RotateClassic(bitmap,180);
        static int id = 0;
        std::string name = "/home/stadmin/pic/sample" + std::to_string(id++) + ".png";
#ifdef FREE_SAVE
        FreeImage_Save(FIF_PNG,bitmap,name.c_str());
#endif
#ifdef QT_SAVE
        //Format_ARGB32
        QImage image(bufferInfo.data,width,height,QImage::Format_ARGB32);
        image.save(QString::fromStdString(name));
#endif
        fibPipeline.push(bitmap);
        gst_sample_unref(sample);
        gst_buffer_unmap(sampleBuffer, &bufferInfo);
        return GST_FLOW_OK;
The color output in FreeImage are totally wrong like when Qt - Format_ARGB32 [ greens like blue or blues like oranges etc.. ] but when I test with Qt - Format_RGBA8888 I can get correct output. I need to use FreeImage and I wish to learn how to correct this.
                        
Since you say Qt succeeds using
Format_RGBA8888, I can only guess: the gstreamer frame has bytes in RGBA order while FreeImage expects ARGB.Quick fix: