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

标签 c++ qt dll jpeg qpixmap

一位用户将我们的应用程序安装到服务器 PC 上,将安装目录共享为网络驱动器 Z:,然后现在从他店内不同的客户端 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,问题 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/

相关文章:

c++ - 找不到 C++ 代码中的错误

c++ - &*x 操作是否创建拷贝?

wpf - 为什么我在尝试添加引用时会看到 "Unable to emit assembly: Referenced assembly ... does not have a strong name"?

c# - 如何在没有安装 MS Office 的机器上使用 Microsoft.Office.Interop.Excel?

c++ - 使用多个头文件和 cpp 文件帮助

c++ - Effective C++,第三版 : Overloading const function

qt - 忽略 OSG 内 Qt 上的键盘按键

c++ - QSocketNotifier - 如何使用它来监视文件? - linux

c++ - Qt:保存 Qt-creator 应用程序的 SQLite 数据库的最佳 "Path"在哪里?

c# - 在 .Net 中实现的插件接口(interface)