图片写入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…

【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 数据可…

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;这是严重的缺勤行为…

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

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

实操上手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;

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

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

飞睿智能超宽带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]代表所有…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》&#xff0c;有朋友问光代码和文字不太真切&#xff0c;能否补充几张图片&#xff0c;今天我们演示一下&#xff1a; 这是第一帧画面&#xff1a;P1&#xff08;我们的参考帧&#xff09; 这是第二帧画面&#xff1a;P2&#xff08;需要编码的帧&…

python包以及异常、模块、包的综合案例(较难)

1.自定义包 python中模块是一个文件&#xff0c;而包就是一个文件夹 有这个_init_.py就是python包&#xff0c;没有就是简单的文件夹 包的作用&#xff1a;当我们的模块越来越多时&#xff0c;包可以帮助我们管理这些模块&#xff0c;包的作用就是包含多个模块&#xff0c;但包…

基于JSP的校园宿舍电费缴纳系统【附源码】

基于JSP的校园宿舍电费缴纳系统 效果如下&#xff1a; 系统首页界面 学生登录界面 公告栏页面 在线留言页面 个人中心界面 管理员登录界面 管理员功能界面 宿舍信息管理界面 余额管理界面 使用电量管理界面 余额提醒管理界面 学生功能界面 研究背景 随着网络的高速发展&…

使用休眠的方式来解决电脑合盖后偶尔不能正常睡眠的问题

背景描述 用过Windows笔记本电脑的用户应该都偶尔遇到过这样的一个问题&#xff0c;就是电脑直接合上盖后放在包里&#xff0c;按道理来说应该会自动进入睡眠模式&#xff0c;但是等电脑再从包里拿出来时发现电脑很烫&#xff0c;并且已经没电了&#xff0c;似乎并没有进入到休…

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路&#xff1a; 1、根据已有的OFD模板&#xff0c;动态替换ofd模板内容&#xff1b;之后将ofd转pdf&#xff08;局限&#xff1a;单行问题不大&#xff09; 可在【乐企】专栏查看详细代码详情可以在此处了解【乐企】有关乐企能力测试接口对接-基础版&a…

Web,RESTful API 在微服务中的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f; 在微服务架构中&#xff0c;Web 和 RESTful …

Python语法结构(三)(Python Syntax Structure III)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…