一位用户将我们的应用程序安装到服务器PC上,将安装目录共享为网络驱动器Z:然后在他的商店里打开来自不同客户端PC的应用程序。除了其中一台电脑上的一个唠叨的bug之外,一切都很好:
在问题PC上,应用程序可以很好地加载库存物品的.jpg
文件,并在QLabel中显示相应的QPixmap。当他当前正在查看的库存物品还没有分配图像时,他可以打开一个文件对话框,选择一个图像并正确地显示它。但是,将(新的/更改的) QPixmap保存为.jpg
,将其存储到磁盘上,作为黑色背景上的一系列彩色垂直线:
保存是通过QPixmap::save( const QString & fileName, ...)
完成的,文件名以编程方式设置为"<some_id>.jpg
“,以指定所需的文件格式。返回true
,但结果文件看起来像现代艺术。
但是,保存映像在服务器和其他客户端上运行得很好。
服务器和问题PC在相同的修补程序级别上运行Windows。
Process为服务器上的应用程序进程和问题PC显示相同的DLL,除了使用dnsapi.dll
的问题PC,而服务器不使用。
Process还显示,在服务器和客户端上,用于处理JPEG的Qt都是\Device\LanmanRedirector\<server>\<app>\plugins\imageformats\qjpeg4.dll
,在qjpeg*.dll
问题PC上进行的全驱动器搜索结果为空,因此应用程序应该在两台计算机上使用相同的JPEG处理代码。
有什么建议吗?
(编辑:将操作系统和补丁状态添加到问题描述中。)
编辑:解决方案:在问题机器上我们有一个16 bpp的颜色深度。将其设置为32 bpp立即解决了我们的问题。我也取代了
`_pm.save( sDestFileName )`
使用
`_pm.toImage().convertToFormat( QImage::Format_RGB32 ).save( sDestFileName )`
这样我们就不会在每台运行小于32 bpp的老客户端PC上遇到这种情况。
发布于 2011-08-22 15:43:58
这里有几件事情试图隔离这个问题:
下面的函数来自我编写的一个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;
}
https://stackoverflow.com/questions/7148907
复制相似问题