首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt中使用FreeImage

在Qt中使用FreeImage
EN

Stack Overflow用户
提问于 2018-03-06 17:52:20
回答 1查看 684关注 0票数 4

我有一段C++/Qt代码,其中我希望使用FreeImage库(http://freeimage.sourceforge.net/)加载图像,并将最终结果存储在QImage中。我知道Qt可以直接加载一些图像格式,但是我希望能够加载一些Qt不直接支持的格式.我试过各种方法让它起作用,但没有一种有效。

在我展示一些失败的尝试之前,这是函数的其余部分,它们都是相同的。下面的代码片段只是复制和粘贴到这个函数中:

代码语言:javascript
复制
QImage load(QString filename) {

    FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.toStdString().c_str(), 0);
    if(fif == FIF_UNKNOWN)
        fif = FreeImage_GetFIFFromFilename(filename.toStdString().c_str());
    if(fif == FIF_UNKNOWN)
        return QImage();

    FIBITMAP *dib = nullptr;
    if(FreeImage_FIFSupportsReading(fif)) {
        dib = FreeImage_Load(fif, filename.toStdString().c_str());
        if(dib == nullptr)
            return QImage();
    } else
        return QImage();

    .... [conversion code comes here] ....

}

我的前两次尝试是非常相似的。第一个尝试将图像加载到QImage中:

代码语言:javascript
复制
    int width  = FreeImage_GetWidth(dib);
    int height = FreeImage_GetHeight(dib);
    int bpp    = FreeImage_GetBPP(dib);
    int size   = width * height * (bpp / 8);

    BYTE *pixels = FreeImage_GetBits(dib);

    QImage img;
    img = img.fromData(pixels, size);
    return img;

第二种方法大致相同,但使用QPixmap:

代码语言:javascript
复制
    int width  = FreeImage_GetWidth(dib);
    int height = FreeImage_GetHeight(dib);
    int bits   = FreeImage_GetBPP(dib);
    int size   = width * height * (bits / 8);

    BYTE *pixels = FreeImage_GetBits(dib);

    QPixmap pix;
    pix.loadFromData(pixels,size);
    return pix.toImage();

我的第三次尝试是尝试让FreeImage将图像保存为JPEG格式的内存,然后在构造图像之前将其加载到QByteArray中:

代码语言:javascript
复制
    FIMEMORY *stream = FreeImage_OpenMemory();
    FreeImage_SaveToMemory(FIF_JPEG, dib, stream);
    FreeImage_Unload(dib);
    long size = FreeImage_TellMemory(stream);

    QByteArray array = QByteArray::fromRawData((char*)stream->data, size);
    QImage img;
    img.loadFromData(array);
    return img;

这些尝试都不起作用。我检查了它是否在早期失败,但它直到获得空图像时才返回任何错误。但是,我不确定我是否在用正确的方式思考.有人有什么想法/暗示我可以尝试吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-06 22:14:50

好吧,我最终自己解决了这个问题

该解决方案有点类似于我上次的尝试,它涉及将加载的映像保存到内存中(在确保它是24位映像之后)和“获取”内存(仍然使用FreeImage),然后可以将其加载到QByteArray中,以便由QImage读取:

代码语言:javascript
复制
QImage load(QString filename) {

    // Get image format
    FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.toStdString().c_str(), 0);
    if(fif == FIF_UNKNOWN)
        fif = FreeImage_GetFIFFromFilename(filename.toStdString().c_str());
    if(fif == FIF_UNKNOWN)
        return QImage();

    // Load image if possible
    FIBITMAP *dib = nullptr;
    if(FreeImage_FIFSupportsReading(fif)) {
        dib = FreeImage_Load(fif, filename.toStdString().c_str());
        if(dib == nullptr)
            return QImage();
    } else
        return QImage();

    // Convert to 24bits and save to memory as JPEG
    FIMEMORY *stream = FreeImage_OpenMemory();
    // FreeImage can only save 24-bit highcolor or 8-bit greyscale/palette bitmaps as JPEG
    dib = FreeImage_ConvertTo24Bits(dib);
    FreeImage_SaveToMemory(FIF_JPEG, dib, stream);

    // Free memory
    FreeImage_Unload(dib);

    // Load JPEG data
    BYTE *mem_buffer = nullptr;
    DWORD size_in_bytes = 0;
    FreeImage_AcquireMemory(stream, &mem_buffer, &size_in_bytes);

    // Load raw data into QImage and return
    QByteArray array = QByteArray::fromRawData((char*)mem_buffer, size_in_bytes);
    return QImage::fromData(array);

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49137081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档