图片写入GPS经纬高信息

news2024/12/23 1:57:58

近期项目中需要往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.coloradmin.cn/o/2224289.html

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

相关文章

2003年秋季我给哈工大数学研究生写的讲义

我写的没出版讲义共有278页&#xff0c;书末参考文献 我写的讲义书末索引&#xff0c;冯克勤的书《代数数论》书末没有索引&#xff0c;陆洪文、李云峰的书《模形式讲义》书末也有索引 我写的讲义自制的封面 &#xff08;对数学的研究我的经验是&#xff0c;跟其他科学类似&am…

「Qt Widget中文示例指南」如何实现半透明背景?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将为大家展示如…

Java应用程序的服务器有哪些

1.Tomcat、Jetty 和 JBoss 区别&#xff1f; Apache Tomcat、Jetty 和 JBoss都是用于部署Java应用程序的服务器&#xff0c;它们都支持Servlet、JSP和其他Java EE&#xff08;现在称为Jakarta EE&#xff09;技术。尽管它们有一些相似的功能&#xff0c;但它们之间还是存在一些…

Mysql在线修改表结构工具gh-ost使用说明及实践

本文内容较多&#xff0c;篇幅较长&#xff0c;若不想了解ghost原理&#xff0c;几种模式的介绍以及具体的验证过程&#xff0c;可直接跳到‘四 gh-ost使用总结’查看简洁版使用说明。 一 gh-ost使用场景 生产环境当有关于一个大表的大操作时(比如select count一个大表)&…

沈阳乐晟睿浩科技有限公司抖音小店领域的强者

在当今数字化浪潮的推动下&#xff0c;电子商务以其便捷性、高效性和广泛的覆盖面&#xff0c;成为了推动经济发展的新引擎。而抖音小店&#xff0c;作为短视频平台上的新兴电商形态&#xff0c;更是凭借其庞大的用户基础、精准的内容推送机制以及独特的购物体验&#xff0c;迅…

qt QNetworkProxy详解

一、概述 QNetworkProxy通过设置代理类型、主机、端口和认证信息&#xff0c;可以使应用程序的所有网络请求通过代理服务器进行。它支持为Qt网络类&#xff08;如QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager等&#xff09;配置网络层代理支持…

Spring Boot框架下的厨艺社交网络构建

1 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时间变得更加地宝贵化&#xff0c;因为每天的…

iOS 本地存储地址(位置)

前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…

IDEA开发工具使用技巧积累

一、IDEA 工具设置默认使用maven的settings.xml文件 第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——>…

深度学习-循环神经网络-LSTM对序列数据进行预测

项目简介: 使用LSTM模型, 对文本数据进行预测, 每次截取字符20, 对第二十一个字符进行预测, LSTM层: units100, activationrelu Dense层: units输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units64 激活函数: 因为是多分类, 使用softmax 因为这是最…

树莓派5使用pytorch训练模型(CPU)

Pytorch 对于树莓派提供了较好的支持&#xff0c;可以利用 Pytorch 在树莓派上进行试试推理&#xff0c;当然也可以使用树莓派进行模型训练了&#xff0c;这里尝试使用树莓派CPU对模型进行训练。 0 环境配置 必要的环境安装&#xff0c;这个步骤没有什么值得说的&#xff0c;…

c++(树)

定义 2-3 树中的每一个节点都有两个孩子&#xff08;称为 2 节点&#xff0c;2-node&#xff09;或三个孩子&#xff08;称为 3 节点&#xff0c;3-node)。 2 节点&#xff0c;有一个数据元素和两个孩子。只能有两个孩子或没有孩子&#xff0c;不能出现只有一个孩子的情况。如果…

JVM学习总结:字节码篇

本文是学习尚硅谷宋红康老师主讲的 尚硅谷JVM精讲与GC调优教程 的总结 &#xff0c;部分内容也参考了 JavaGuide 网站&#xff08;文末有链接&#xff09; JVM 概述 Oracle JDK 与 OpenJDK 是什么关系&#xff1f; 2006 年 SUN 公司将 Java 开源&#xff0c;也就有了 OpenJDK。…

【verilog】四位全加器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 FPGA 全加器 实验 一、实验原理 module adder(ain,bin,cin,cout,s); input ain,bin,cin; output cout,s; assign coutain&bin | ain&cin | bin&cin; assign sain^bin^cin; endmoduletimesc…

复杂类型map与struct

1.map:Key-Value 型数据格式 建表: create table myhive.test_map( id int, name string, members map<string,string>, age int) row format delimited fields terminated by , COLLECTION ITEMS TERMINATED BY # MAP KEYS TERMINATED BY :; 数据导入:load data local …

基于ssm+jsp的地方疫情管理系统(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统包含两个…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料&#xff1a; Fast Simulation of Mass-Spring Systems in Rust 论文阅读&#xff1a;Fast Simulation of Mass-Spring Systems 【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文) Projective Dynamics笔记(一…

新手做私域学会这三步,一周时间营收翻倍

在数字化营销的时代&#xff0c;私域流量的运营已经成为品牌和创业者提升营收的关键。如果你是一个私域营销的新手&#xff0c;那么这篇文章将是你的福音。我们将分享三个简单而有效的步骤&#xff0c;帮助你在短短一周内实现营收翻倍的目标。 第一步&#xff1a;明确人设——…

SpringBoot项目整合Knife4J

SpringBoot项目整合Knife4J 前言为什么要使用API文档什么是API文档 Knife4jKnife4j的进化史Swagger和Knife4J的关系 SpringBoot整合Knife4j版本适配实现步骤1.导入依赖2.编写配置类新建一个controller进行测试启动项目 Knife4j增强配置常用注解例子展示实体类注解Controller注解…