首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将QPixmap保存为竖线中的JPEG结果

将QPixmap保存为竖线中的JPEG结果
EN

Stack Overflow用户
提问于 2011-08-22 14:21:43
回答 1查看 2K关注 0票数 1

一位用户将我们的应用程序安装到服务器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立即解决了我们的问题。我也取代了

代码语言:javascript
复制
  `_pm.save( sDestFileName )`

使用

代码语言:javascript
复制
  `_pm.toImage().convertToFormat( QImage::Format_RGB32 ).save( sDestFileName )`

这样我们就不会在每台运行小于32 bpp的老客户端PC上遇到这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-22 15:43:58

这里有几件事情试图隔离这个问题:

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

下面的函数来自我编写的一个OSS程序。您可以尝试使用它,然后显示第二个参数中引用的QImage的内容:

代码语言:javascript
复制
//! 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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7148907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档