将QPixmap保存为JPEG会产生垂直线

时间:2011-08-22 14:21:43

标签: c++ qt dll jpeg qpixmap

用户将我们的应用程序安装到服务器PC,将安装目录共享为网络驱动器Z:现在从他的商店的不同客户端PC打开应用程序。一切工作正常,除了其中一台PC上的一个小问题:

在问题PC上,应用程序可以正常加载库存项目的.jpg个文件,并在QLabel中显示相应的QPixmap。当他正在查看的库存项目尚未分配图像时,他可以打开文件对话框,选择图像并正确显示。但是,保存(新的/已更改的)QPixmap作为.jpg将其作为一系列彩色垂直线存储在光盘上:

(this should actually be some jewellery)

通过QPixmap::save( const QString & fileName, ...)保存,文件名以编程方式设置为“<some_id>.jpg”以指定所需的文件格式。返回true,但生成的文件看起来像现代艺术。

但是,保存图像在服务器和其他客户端上运行良好。

服务器和问题PC都以相同的补丁级别运行Windows XP。

Process Explorer在服务器和问题PC上显示相同的DLL,但使用dnsapi.dll的问题PC除外,服务器没有。

Process Explorer还显示,在服务器和客户端上,用于处理JPEG的Qt DLL是 \Device\LanmanRedirector\<server>\<app>\plugins\imageformats\qjpeg4.dll,问题PC上qjpeg*.dll的驱动器范围内的搜索显示为空,因此应用在两台计算机上使用相同的JPEG处理代码。

有什么建议吗?

(编辑:在问题描述中添加操作系统和补丁状态。)

问题机器上的

编辑:解决方案:我们的颜色深度为16 bpp。设置为32 bpp立即解决了我们的问题。我也换了 _pm.save( sDestFileName )

_pm.toImage().convertToFormat( QImage::Format_RGB32 ).save( sDestFileName )
这样我们就不会在每台运行小于32 bpp的旧客户端PC上遇到这种情况。

1 个答案:

答案 0 :(得分:2)

以下是尝试隔离问题的一些方法:

  • 将qjpeg4.dll复制到客户端的工作目录
  • 保存为PNG或GIF时图像是否已损坏?
  • 将您的数据转换为QImage并从中开始工作。
  • 考虑字节格式(我通常使用ARGB32,因为它是int-aligned)
  • 要测试问题发生的位置,您可以尝试将图像转换为JPG格式,然后在调试窗口中查看。

以下功能来自我写的OSS program。您可以尝试使用它,然后显示第二个参数中引用的QImage的内容:

//! Saves image with JPEG compression in given quality (0 - 100, Qt's scale)
//! @param[in] in The lossless input image
//! @param[out] out The image to save to using JPEG compression
//! @param quality The quality level (0 - 100, 0 the most compressed)
//! @return The size of the saved image
quint32 Window::imageSaveLossy(QImage &in, QImage &out, quint8 quality)
{
        quint32 retval;
        QByteArray ba;
        QBuffer buffer(&ba);
        buffer.open(QIODevice::WriteOnly);

        QImage temp(in.size(), QImage::Format_ARGB32);
        temp.fill(QColor(Qt::white).rgb());
        QPainter painter(&temp);
        painter.drawImage(0, 0, in);

        temp.save(&buffer, "JPG", quality);
        out.loadFromData(ba, "JPG");
        retval = (quint32)ba.size();
        buffer.close();
        return retval;
}