1

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

在问题 PC 上,该应用程序可以.jpg很好地加载库存项目的文件并在 QLabel 中显示相应的 QPixmap。当他当前正在查看的库存项目还没有分配给它的图像时,他可以打开一个文件对话框,选择一个图像并正确显示它。但是,(新的/更改的)QPixmap 保存为 a.jpg将其作为黑色背景上的一系列彩色垂直线存储到磁盘:

(这实际上应该是一些珠宝)

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

但是,保存图像在服务器和其他客户端上工作正常。

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

进程资源管理器显示服务器和问题 PC 上的应用程序进程的相同 DLL,但问题 PC 使用dnsapi.dll,而服务器没有。

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 上遇到这个问题。

4

1 回答 1

2

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

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

下面的函数来自我写的一个OSS程序。您可以尝试使用它,然后显示第二个参数中引用的 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;
}
于 2011-08-22T15:43:58.930 回答