QT QPixmap或者QImage加载图片程序异常结束问题(code: 0xc0000602: ,)

1、前言

我之前发了一个笔记,记录txt文件中的字符串形式的图片数据,以二进制流写入图片文件中直接合成一张图片的方法(文章链接,有兴趣可以看:QT 字符串形式的JPG图片原编码数据怎么保存为一张图片_qt转换16进制图片并显示-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Blasit/article/details/129422460?spm=1001.2014.3001.5502),这个图片数据我原本都是通过TCP通信来的,所以会对每包数据进行通信校验来保证图片数据的正确性。但是最近需要测试一个通信功能,不再进行校验图片数据了,这就导致保存的图片数据格式比较混乱(图片损坏),然后程序运行运行着就异常退出了,没有任何错误提示,调试后发现是指针越界(错误代码code: 0xc0000602),一步步调试才发现是在QPixmap初始化(new)加载图片的时候程序退出(使用QImage也是)。寻着这这个代码在网上找到了相关的帖子,但是别人都已经QPixmap初始化成功了,到我这里就不一样。总之最后放弃在网上找了,根本找不到tmd。

最后自己用画图软件打开损坏的图片,随便画了一下然后重新保存,然后!QPixmap就可以初始化成功了,我查了一下资料,JPEG格式的图片数据包含数据长度信息,很明显这就是错误所在,本来想着自己修复的,毕竟QFile类可以得到数据长度,然后就放弃了,根本就是我太菜。

2、图片类型识别

虽然我的图片数据比较混乱,但起码还是可以使用QImageReader类读出数据格式为JPEG的,说明还有救,只需要稍稍对图片进行一个正确格式的重新保存就应该没问题了,那么问题就变成了:怎么使用QT 将图片以正确格式重新保存,并且不使用QPixmap和QImage类(前面说了,使用就会程序退出)。

那么就只能使用第三方库了,当前首选就是OpenCV了,所以我先查了一下代码看看复不复杂,如下,超级简单:


    // 读取图像
    cv::Mat image = cv::imread(inputImagePath);

    // 检查图像是否成功加载
    if (image.empty()) {
        qDebug() << "Error: Unable to load the image.";
        return -1;
    }

    // 保存图像为新文件
    bool success = cv::imwrite(outputImagePath, image);

    if (success) {
        qDebug() << "Image saved successfully to:" << QString::fromStdString(outputImagePath);
    } else {
        qDebug() << "Error: Unable to save the image.";
    }

代码都有了,那就赶紧去配置环境。

3、C++ QT OpenCV的环境配置

这里使用的是mingw的套件,所以我只安装了这个版本的OpenCV库

安装教程网上一堆堆的,随便找了一个简单的:

Windows上Qt配置OpenCV(最简单版本无需自己编译-避坑必看)_qt opencv安装 不编译-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/kdnnnd/article/details/132840038?spm=1001.2014.3001.5506

我是这样做的:

①下载文章中的mingw版本已编译

②解压-》添加环境变量x64\mingw\bin和lib(写你自己的路径)

③.pro文件加入(写你自己的路径)

INCLUDEPATH+= OpenCV-MinGW-Build-OpenCV-3.4.8-x64\include

LIBS+=OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\bin\libopencv_*.dll
#或者 LIBS+=OpenCVLIB\OpenCV-MinGW-Build-OpenCV-3.4.8-x64\x64\mingw\lib\libopencv_*.a

④可以用了,记得加头文件#include "opencv2/opencv.hpp"

⑤好像要重启电脑,然后重新编译(我手动直接清空之前的编译目录),因为没报错但是一直程序运行不起来来着,好像是这么回事。

⑥打包的时候注意了,使用windeployqt打包不会添加这个第三方的.dll文件(这里是OpenCV的),需要手动添加。(怎么使用windeployqt打包完整,我也不知)。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT QImage加载图片可以通过以下步骤完成。首先,创建一个QImage对象和一个QLabel对象,然后使用load()函数加载图片文件。可以通过右击工程的图片获取图片路径。接下来,使用setPixmap()函数将QImage对象转换为QPixmap对象,并将其设置为QLabel的显示内容。还可以使用setGeometry()函数设置QLabel相对于父类的位置。最后,使用show()函数显示QLabel。 另外,可以使用QImageReader的方法读取图片。首先设置QImageReader的属性,例如setDecideFormatFromContent()设置是否根据内容自动确定图片格式,setScaledSize()设置图片的大小。然后使用setFileName()函数设置图片的路径。如果可以读取图片,使用read()函数读取图片,并通过QPainter的drawPixmap()函数绘制图片。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [一种QImage加载图片的解决方案](https://download.csdn.net/download/fregry10/10685883)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【QT】添加图片资源并使用QImage加载图片显示](https://blog.csdn.net/weixin_43894927/article/details/107177957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Qt加载图片图片较大无法正常加载,显示空白处理方法)](https://blog.csdn.net/fhakfs/article/details/124500642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值