1、前言
我之前发了一个笔记,记录txt文件中的字符串形式的图片数据,以二进制流写入图片文件中直接合成一张图片的方法(文章链接,有兴趣可以看:QT 字符串形式的JPG图片原编码数据怎么保存为一张图片_qt转换16进制图片并显示-CSDN博客https://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库
安装教程网上一堆堆的,随便找了一个简单的:
我是这样做的:
①下载文章中的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打包完整,我也不知道)。