用户将我们的应用程序安装到服务器PC,将安装目录共享为网络驱动器Z:现在从他的商店的不同客户端PC打开应用程序。一切工作正常,除了其中一台PC上的一个小问题:
在问题PC上,应用程序可以正常加载库存项目的.jpg
个文件,并在QLabel中显示相应的QPixmap。当他正在查看的库存项目尚未分配图像时,他可以打开文件对话框,选择图像并正确显示。但是,保存(新的/已更改的)QPixmap作为.jpg
将其作为一系列彩色垂直线存储在光盘上:
通过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上遇到这种情况。
答案 0 :(得分:2)
以下是尝试隔离问题的一些方法:
以下功能来自我写的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;
}