图片写入GPS经纬高信息

server/2024/10/22 6:23:54/

近期项目中需要往java平台传输图片,直接使用QNetworkAccessManager和QHttpMultipart类即可,其他博文中有分享。

主要是平台接口对所传输图片有要求:需要包含GPS信息(经度、纬度、高度)。

Qt无法直接实现,查了很多资料,发现exiv2库可以使用,经过一番折腾后,最终成功向平台传输,在此做个记录。


需要库exiv2,已提供下载。


经度、纬度、高度的写入:

#include"exiv2/exiv2.hpp"
using namespace std;bool ImageAnalysis::AddExifGPSInfo(const QString &keyStr,const QString& value)
{QStringList tempList;QString tempValue;if(keyStr == "Exif.GPSInfo.GPSAltitude"){tempValue = AltitudeToExiivGps(value);}else{tempList = DegreeToDDMMSS(value);tempValue = DDMMSSToExivGps(tempList);}std::string _keyStr = keyStr.toStdString();std::string _value = tempValue.toStdString();Exiv2::ExifKey tmp = Exiv2::ExifKey(_keyStr);Exiv2::ExifData::iterator pos = m_ed.findKey(tmp);if (pos == m_ed.end()){Exiv2::URationalValue::AutoPtr rv(new Exiv2::URationalValue);rv->read(_value);Exiv2::ExifKey key = Exiv2::ExifKey(_keyStr);m_ed.add(key, rv.get());}else//exif有 key{Exiv2::Value::AutoPtr v = pos->getValue();//将值指针向下强制转换为其实际类型Exiv2::URationalValue* prv = dynamic_cast<Exiv2::URationalValue*>(v.release());if (prv == 0)return false;Exiv2::URationalValue::AutoPtr rv(prv);rv->read(_value);pos->setValue(rv.get());}WriteExifData();return true;
}bool ImageAnalysis::WriteExifData()
{if(m_imagePtr.get() != 0){m_imagePtr->setExifData(m_ed);m_imagePtr->writeMetadata();return true;}return false;
}// 初始化
ImageAnalysis::ImageAnalysis(QString imagePath, QObject *parent):m_imagePath(imagePath),QObject(parent)
{std::string temp = m_imagePath.toStdString();m_imagePtr = Exiv2::ImageFactory::open(temp);if (m_imagePtr.get() == nullptr){qDebug()<< "Read Exif Error.";return;}m_imagePtr->readMetadata();m_ed.clear();m_ed = m_imagePtr->exifData();
}

额外经度Ref、纬度Ref、高度Ref信息写入:

// GPSLongitudeRef写入
void ImageAnalysis::AddRefLongitude(const QString &WE)
{Exiv2::Value::AutoPtr longitudeRefValue = Exiv2::Value::create(Exiv2::asciiString);longitudeRefValue->read(WE.toStdString());m_ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSLongitudeRef"), longitudeRefValue.release());
}// GPSLatitudeRef写入
void ImageAnalysis::AddRefLatitude(const QString &NS)
{Exiv2::Value::AutoPtr latitudeRefValue = Exiv2::Value::create(Exiv2::asciiString);latitudeRefValue->read(NS.toStdString());m_ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSLatitudeRef"), latitudeRefValue.release());
}// GPSAltitudeRef写入
void ImageAnalysis::AddRefAltitude(const QString &flag)
{Exiv2::Value::AutoPtr altitudeRefValue = Exiv2::Value::create(Exiv2::unsignedByte);altitudeRefValue->read(flag.toStdString());m_ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef"), altitudeRefValue.release());
}

功能调用过程:

{ImageAnalysis imageAnalysis;imageAnalysis.Reset(fileName);                    // jpg文件名设置imageAnalysis.AddExifGPSInfo(GPS_Longitude, lon); // 经度添加imageAnalysis.AddExifGPSInfo(GPS_Latitude,  lat); // 纬度添加imageAnalysis.AddExifGPSInfo(GPS_Altitude,  alt); // 高度添加imageAnalysis.AddRefLongitude("E");               // 经度Ref添加imageAnalysis.AddRefLatitude("W");                // 纬度Ref添加imageAnalysis.AddRefAltitude("0");                // 高度Ref添加imageAnalysis.WriteExifData();                    // GPS信息保存
}

到此,大功告成!!! 


验证一:系统中图片属性-详细信息中就有了GPS一栏:

验证二:使用Exif Pilot软件,可以看到更专业的信息:


http://www.ppmy.cn/server/133819.html

相关文章

数据驱动时代:五款免费报表工具深度解析

在当今数据驱动的时代&#xff0c;报表工具已经成为各类企业进行决策和管理的重要工具。无论是大中型企业还是小微企业&#xff0c;能够快速、高效地生成可视化报表&#xff0c;洞察业务运营情况&#xff0c;已经成为提升竞争力的关键。今天为大家挑选了5款非常优秀的报表软件&…

STM32G4系列MCU的ADC模块标定方法和采样时间

目录 概述 1 ADC模块标定 1.1 功能介绍 1.2 软件程序校准ADC 1.2.1 标定步骤 1.2.2 标定时序框图 1.3 软件程序重新注入校准因子到ADC 1.3.1 标定步骤 1.3.2 更新ADC校准因子 1.4 用单个ADC转换单端和差分模拟输入 1.4.1 标定流程 1.4.2 混合单端和差分通道 2 通道…

WPF中的Style

Style介绍 在XAML中&#xff0c;Style是一个用于定义控件的默认属性值的资源。通过样式&#xff0c;你可以设置一组属性&#xff0c;这些属性将被应用到所有使用该样式的控件上。这有助于保持应用程序的一致性&#xff0c;并且可以减少重复的标记&#xff0c;使得UI的维护更加…

微信小程序canvas 生成二维码图片,画图片,生成图片,将两个canvas结合并保存图片

需求实现步骤如下 先定义两个canvas一个canvas myQrcode画二维码的图片另一个canvas mycanvas画一个背景图&#xff0c;并把二维码画到这个canvas上&#xff0c;mycanvas这个canvas生成一张图片&#xff0c;返回图片的临时路径最后保存图片到手机 首先wxml,新版微信小程序can…

大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

1.IDEA开发之子模块无法继承父模块的依赖

目录 1.1 出现的问题 1.2 父模块的Pom.xml配置文件 1.3 子模块的Pom.xml配置文件 1.4 思考&#xff1a;究竟哪里出现了问题&#xff1f; 1.1 出现的问题 在开发Spring引入数据库外部配置文件&#xff0c;发现我开发的父模块Spring以及子模块spring6-ioc-xml出现了无法…

毕业设计选题:基于Hadoop的热点新闻分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 新闻类型管理 主题标签管理 热点新闻管理 新闻…

集合框架15:Map接口概述、Map集合使用

视频链接&#xff1a;13.34 Map接口使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p34 1.Map接口概述 特点&#xff1a;存储一对数据&#xff08;Key-Value&…