图片写入GPS经纬高信息

近期项目中需要往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.mzph.cn/web/56077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教育平台的创新设计:Spring Boot实现

3系统分析 3.1可行性分析 通过对本信息化在线教学平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本信息化在线教学平台采用Spring Boot框架&#xff0c;JA…

LINUX1.1

目录 文件夹 文件&#xff1a;存储数据 文件夹&#xff1a;文件的目录 操作系统&#xff1a;广泛应用于服务器、桌面、移动设备和嵌入式系统等领域 应用软件&#xff1a;Linux操作系统以其稳定性、安全性和灵活性著称&#xff0c;广泛应用于服务器、桌面、移动设备和嵌入式系…

【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些

一、目的&#xff1a;WPF中MarkupExtension使用的IServiceProvider参数都有哪些&#xff0c;都是做什么的 在 WPF 中&#xff0c;MarkupExtension 类的 ProvideValue 方法接受一个 IServiceProvider 参数。IServiceProvider 是一个服务定位器接口&#xff0c;允许你在运行时获取…

深入理解 Kafka

一、引言 在当今的大数据和分布式系统时代&#xff0c;高效的消息传递和处理是构建可靠、可扩展应用的关键。Apache Kafka 作为一种高吞吐量的分布式发布 - 订阅消息系统&#xff0c;在众多领域中发挥着重要作用。本文将深入探讨 Kafka 的核心概念、架构、工作原理、应用场景以…

Axure重要元件三——中继器修改数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器修改数据 主要内容&#xff1a;显示编辑内容、表格赋值、修改数据 应用场景&#xff1a;更新行、表单数据行修改 案例展示&#xff1a; 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局&#xff08;如果需要交互界面的话&#xff0c;这里简单假设一个基本布局&#xff09; 四、创建MusicService类 五、在MainActivity中启动和控制Service&#xff08;也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

实现mysql定时执行任务

使用场景&#xff0c;每天想定时去执行一次数据同步&#xff0c;可以进行实现每天某个时间段去查询两个数据库表中数据进行数据同步 具体步骤包括两步&#xff1a; 先查看定时任务是否开启 SHOW VARIABLES LIKE event_scheduler; #查看是否开启&#xff0c;NO表示开启,默认是…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数&#xff1b;1982、1990、2000、2010、2020年数据为当年人口…

Scala的多态

从编译的角度解释Scala的多态含义&#xff1a;在执行期间而非编译期间确定所引用对象的类型&#xff0c;根据实际类型调用其方法。一个编译型语言有两种类型&#xff0c;分别为编译类型和运行类型。程序中定义的引用变量所指向的具体类型和通过该变量发出的方法调用在编译时不确…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库&#xff0c;常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令&#xff0c;并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

计算广告第三版pdf

需要该书pdf版本的同学点赞&#xff0c;私信我&#xff1a;

拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索

本文目录&#xff1a; &#x1f4a1;前言&#xff1a;技术的边界在不断延展&#x1f31f;目录&#x1f308;什么是腾讯云云开发&#xff1f;&#x1f4be;云数据库&#xff1a;让数据成为开发的稳固基石&#x1f951;数据&#xff0c;不再只是数据 &#x1f6e0;云模板&#xf…

Spark_入库时报错ORA-00001 unique constraint violated 解决办法

首先可能是数据入重复了 检查一下看看是否入库前删除了分区的数据&#xff0c;可能是重复数据入库的问题&#xff0c;如果不是这个那么继续排查。 入库的数据有问题&#xff0c;检测方法 如果报主键冲突了&#xff0c;则group by 一下id,date&#xff0c;然后select 的时候加一…

docker 数据管理,数据持久化详解 二 数据卷容器

数据卷和数据卷容器核心区别 持久性对比 数据卷&#xff1a;当您直接在启动容器时指定了一个数据卷&#xff08;例如&#xff0c;使用docker run -v /data&#xff09;&#xff0c;这个数据卷会自动创建&#xff0c;并且其内容会在容器停止或删除后继续存在。您可以随时通过Do…

飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净

在信息爆炸的时代&#xff0c;音频传输技术正以未有的速度发展&#xff0c;创新我们进入一个全新的听觉世界。今天&#xff0c;我们要探讨的&#xff0c;就是这场技术创新中的一颗璀璨明星——飞睿智能超宽带&#xff08;UWB&#xff09;音频传输模块。它以其独特的优势&#x…

RHCSA课后练习1

文件管理命令练习 vi/vim练习 vim newfile 按 a 进入编辑模式 &#xff1a;r 文件 在末尾模式中插入文件 &#xff1a;%s/#/ /g 先将#标记为匹配项&#xff1a;%g#d 再删除 : set nu 开启行号 自行组cp 用grep命令找到6段再用tail命令选中第六段 用find查找 [A-Z]代表所有…