无法在发布模式下从字节数组加载QImage

时间:2017-06-23 00:49:13

标签: c++ qt qimage qtcpsocket

在我的应用中,我以JPEG格式从Android设备上通过QTcpSocket作为字节数组接收图像。

当我在我的开发PC上运行这个应用程序时,它就像一个魅力(在调试和释放模式下)。但是,我无法从未安装Qt的另一台PC上的字节数组加载QImage

我在Qt中为我的平台(Windows x64,msvc_2015_64)包含了所有* .dll文件,并且还安装了Visual Studio C ++ Redistributable 2015.我的应用程序启动正常(没有出现任何错误,一些* .dll文件丢失)。但是QImage一直都是空的。

首先我认为根本没有接收到字节数组,所以我检查了它的大小,发现它正在被正确接收。

我正在使用此代码从QImage字节加载uchar

void handleImageBytes(uchar *bytes, qint64 length)
{
    QImage image;
    image.loadFromData(bytes, length, "JPEG");
    emit frameReady(image);
}

我从QTcpSocket收到这些字节:

void handleReadyRead()
{
    if(this->incomingFrameLength==0){
        QString data = this->client->readAll();
        this->incomingFrameLength = data.toInt();
        this->client->write("ok");
        qDebug()<<QString("Received frame length: %1").arg(this->incomingFrameLength);
        return;
    }

    if(this->incomingFrameLength!=0 && this->client->bytesAvailable()<this->incomingFrameLength)
         return;

    uchar* data = (uchar*)malloc(this->incomingFrameLength+256);
    qint64 len = this->client->read((char*)data, this->incomingFrameLength+256);

    qDebug() << QString("Received %1 bytes").arg(len);

    handleImageBytes(data, len);

    this->incomingFrameLength=0;
    this->client->write("received");
    qDebug()<<QString("Received frame of length %1").arg(len);
    free(data);
}

如您所见,首先我收到图像的大小作为字节数组的长度。 然后我等待在QTcpSocket的缓冲区中接收并准备好所有必需的字节。然后我创建指向具有足够大小的字节数组的指针,将传入的字节加载到该数组并从上面调用handleImageBytes方法。

这一切在我的开发PC上运行正常(Windows 7 x64,Qt 5.7,msvc_2015_64)。 但是,当我将包含所有必需的* .dll文件的发布代码移动到未安装Qt的其他PC时,从字节数组加载图像不起作用。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果它在你的开发系统中工作,那么你可能仍然缺少一些DLL。不幸的是,Qt只会抱怨强制性的DLL,但还有其他的插件是可选的,只有当它们存在时(例如读取某些图像格式),某些功能才有可能,而不显示任何 DLL丢失错误。

<QTDIR>\plugins\imageformats文件夹(其中<QTDIR>是Qt版本的安装路径,例如我的C:\Qt\qt_5_6_1\msvc2010)复制到您的可执行文件所在的目录。请注意,调试和发布二进制文件混合在同一文件夹中,因此只需复制与构建配置相对应的文件。

您的项目目录应该类似于:

project\
        project.exe
        Qt5Core.dll
        Qt5Gui.dll
        ...
        imageformats\
                     qgif.dll
                     qico.dll
                     qjpeg.dll
                     ...

Qt VS Add-on自动将一些目录添加到路径中,这就是从IDE运行时不会失败的原因。

注意:如果您想使用SVG图片,您还必须复制iconengines\qsvgicon.dllQt5Svg.dll