gpt4 book ai didi

c++ - 使用 C++ 修改 EXIF 数据

转载 作者:行者123 更新时间:2023-12-01 15:02:15 30 4
gpt4 key购买 nike

我们正在为比赛 build 一个四轴飞行器机器人,其中一个要求是我们必须使用安装在四轴飞行器上的相机拍摄照片。

我编写了一个简单的 OpenCV 程序,能够以 .jpg 格式捕获它们,但我的相机或我的程序无法将“纬度”和“经度”保存为图像上的 EXIF。

我已经为我的机器人添加了一个 GPS 模块,它可以在拍摄照片时检索 GPS 数据并将它们保存到文本文件中。

所以我的主要问题是在捕获图片时将文本文件中的这些数据分别添加到图片中。

我尝试了很多库,例如:

  • easyexif
  • Exiv2
  • 菲尔·哈维

我也尝试过:

  • Visual C++.net 2015
  • 开发 C++ (GCC)
  • 代码块 (GCC)

我还从事 PHP 方面的工作,但我只能读取和提取 EIXF,但无法在我的图片上写入新数据。

我该如何解决这个问题?

最佳答案

您可以使用此代码。我用了Image::GetPropertyIdList methodReading and Writing Metadata作为此代码的 Material 。不幸的是,我没有在 opencv 中找到任何可以操作 Exif 的函数。

 #include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
#include <Math.h>
#pragma comment(lib,"gdiplus.lib")
using namespace Gdiplus;


int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) //i copy this function from Doc.microsoft.com
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

GetImageEncodersSize(&num, &size);
if (size == 0)
return -1; // Failure

pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if (pImageCodecInfo == NULL)
return -1; // Failure

GetImageEncoders(num, size, pImageCodecInfo);

for (UINT j = 0; j < num; ++j)
{
if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}

free(pImageCodecInfo);
return -1; }


int main(){
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Status stat;
CLSID clsid;

Bitmap* bitmap = new Bitmap(L"Source.bmp"); // you can use any Image Format as Source
PropertyItem* propertyItem = new PropertyItem;
// Get the CLSID of the JPEG encoder.
GetEncoderClsid(L"image/jpeg", &clsid);

double dlan = 35.715298; // we supposed that your GPS data is Double if its not skip this step
// convert double to unsigned long array
double coord = dlan;
int sec = (int)round(coord * 3600);
int deg = sec / 3600;
sec = abs(sec % 3600);
int min = sec / 60;
sec %= 60;
unsigned long ulExifCoordFormatLan[6] = { deg, 1, min, 1, sec, 1 };
propertyItem->id = PropertyTagGpsLatitude;
propertyItem->length = sizeof(long) * 2 * 3;
propertyItem->type = PropertyTagTypeRational;
propertyItem->value = ulExifCoordFormatLan;
Status s = bitmap->SetPropertyItem(propertyItem);// saving image to the destination

stat = bitmap->Save(L"Dest.jpg", &clsid, NULL);
if (s == Ok && stat==Ok)
printf("Dest.jpg saved successfully .\n");

delete propertyItem;
delete bitmap;
GdiplusShutdown(gdiplusToken);
return 0;}

关于c++ - 使用 C++ 修改 EXIF 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320775/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com