一位用户将我们的应用程序安装到服务器 PC 上,将安装目录共享为网络驱动器 Z:,然后现在从他店内不同的客户端 PC 上打开该应用程序。除了其中一台 PC 上的一个烦人的错误外,一切正常:
在有问题的电脑上,应用程序可以加载 .jpg
库存项目的文件就好了,并在 QLabel 中显示相应的 QPixmap。当他当前正在查看的库存项目还没有分配图像时,他可以打开一个文件对话框,选择一个图像并正确显示。但是,将(新的/更改的)QPixmap 保存为 .jpg
将其作为黑色背景上的一系列彩色垂直线存储到光盘:
保存是通过 QPixmap::save( const QString & fileName, ...)
完成的以编程方式将文件名设置为“<some_id>.jpg
”以指定所需的文件格式。返回true
, 但生成的文件看起来像现代艺术。
但是,保存图像在服务器和其他客户端上工作正常。
服务器和问题 PC 都运行相同补丁级别的 Windows XP。
Process Explorer 为服务器和问题 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 上遇到此问题。
最佳答案
这里有一些尝试隔离问题的方法:
- 将qjpeg4.dll复制到客户端的工作目录
- 保存为 PNG 或 GIF 时图像是否损坏?
- 将您的数据转换为 QImage 并从中处理。
- 考虑字节格式(我通常使用ARGB32,因为它是int对齐的)
- 要测试出现问题的位置,您可以尝试将图像转换为 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;
}
关于c++ - 将 QPixmap 保存为 JPEG 会产生垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7148907/