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

文章讲述了作者在处理从TCP通信接收的图片数据时遇到的问题,指针越界和QPixmap/QImage初始化失败。通过识别图片类型并使用OpenCV重置JPEG格式,解决了图片损坏导致的程序异常。同时介绍了C++/Qt与OpenCV环境的配置过程。
摘要由CSDN通过智能技术生成
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.";
    }

代码都有了,接下来配置完环境就OK了。

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打包完整,我也不知道)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值