图像中的Exif信息及其处理

1.Exif

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息[1]。

xif标准最初由日本电子工业发展协会(JEIDA - Japan Electronic Industry Development Association)制订,目前的最新版本是发布于2010年04月的 Exif 2.3 版,该版本曾在2012年12月以及2013年5月有所修正 ,并已经应用到各个厂商的新影像设备中。2

Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看 Exif 文件,但图像一旦被修改,Exif 信息可能会永久丢失,故编辑 Exif 必须使用专门的软件。所有的JPEG图像以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。0xFFE0 – 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。3

在这里插入图片描述

标签号Exif 定义名中文定义名备注
0x010EImageDescription图像描述
0x013BArtist作者
0x010FMake生产商
0x0110Model型号相机型号
0x0112Orientation方向
0x011AXResolution水平方向分辨率
0x011BYResolution垂直方向分辨率
0x0128ResolutionUnit分辨率单位
0x0131Software软件固件Firmware版本或者编辑软件
0x0132DateTime日期和时间照片最后修改时间
0x0213YCbCrPositioningYCbCr定位
0x8769ExifOffsetExif子IFD偏移量
0x829AExposureTime曝光时间快门速度
0x829DFNumber光圈系数光圈的F值
0x8822ExposureProgram曝光程序自动曝光、光圈优先、快门优先、M档等
0x8827ISOSpeedRatingsISO感光度
0x9000ExifVersionExif 版本
0x9003DateTimeOriginal拍摄时间照片拍摄时间
0x9004DateTimeDigitized数字化时间照片被写入时间
0x9204ExposureBiasValue曝光补偿
0x9205MaxApertureValue最大光圈
0x9207MeteringMode测光模式平均测光、中央重点测光、点测光
0x9208Lightsource光源一般记录白平衡
0x9209Flash闪光灯闪光灯状态
0x920AFocalLength镜头焦距镜头物理焦距
0x927CMakerNote厂商注释
0x9286UserComment用户注释
0xA000FlashPixVersionFlashPix版本
ColorSpace色彩空间AdobeRGB、sRGB等
ExifImageWidth图像宽度
0xA003ExifImageLength图像高度
0xA433LensMake镜头生产商
0xA434LensModel镜头型号

通过以上可知,Exif信息是可以修改的,包含部分隐私数据,发送原图时很有可能会附带Exif信息。

2.对计算机视觉模型的影响

在使用手机或相机拍照时,有时候会横握设备有时候又竖握设备,手持方向发生变化,设备内部的重力感应器件会告诉设备,照片究竟哪个边是向上的。然而,实际图像的像素数据不会旋转,因为图像传感器是对连续的像素信息流进行逐行读取的,因此无论纵向和横向握持相机,图像都是按照一个方向进行存储,拍照设备和电脑之所以能够按照正确的方向显示图片,正是因为照片中保存的Exif信息。下图参考自4

在这里插入图片描述

图片阅读器之所以能够将横向排列的图像数据显示为正常图像,是因为根据Exif中的orientation参数对展示图像进行了处理,如果图片处理程序不处理Exif信息,那么图像将横向展示如下图:
在这里插入图片描述

一些图像处理程序不会去解析Exif信息,如NumPy、SciPy,TensorFlow,Keras等,当使用这些工具导入图像时,都将获得原始的未旋转图像数据,如横竖上下颠倒等,将如此数据输入视觉模型中时,会影响模型的分类检测分割效果

PIL库中,Exif的编码可通过如下方式获取

from PIL.ExifTags import TAGS
print(TAGS)
{
	11: 'ProcessingSoftware',
	254: 'NewSubfileType',
	255: 'SubfileType',
	256: 'ImageWidth',
	257: 'ImageLength',
	258: 'BitsPerSample',
	259: 'Compression',
	262: 'PhotometricInterpretation',
	263: 'Thresholding',
	264: 'CellWidth',
	265: 'CellLength',
	266: 'FillOrder',
	269: 'DocumentName',
	270: 'ImageDescription',
	271: 'Make',
	272: 'Model',
	273: 'StripOffsets',
	274: 'Orientation',
	277: 'SamplesPerPixel',
	278: 'RowsPerStrip',
	279: 'StripByteCounts',
	280: 'MinSampleValue',
	281: 'MaxSampleValue',
	282: 'XResolution',
	283: 'YResolution',
	284: 'PlanarConfiguration',
	285: 'PageName',
	288: 'FreeOffsets',
	289: 'FreeByteCounts',
	290: 'GrayResponseUnit',
	291: 'GrayResponseCurve',
	292: 'T4Options',
	293: 'T6Options',
	296: 'ResolutionUnit',
	297: 'PageNumber',
	301: 'TransferFunction',
	305: 'Software',
	306: 'DateTime',
	315: 'Artist',
	316: 'HostComputer',
	317: 'Predictor',
	318: 'WhitePoint',
	319: 'PrimaryChromaticities',
	320: 'ColorMap',
	321: 'HalftoneHints',
	322: 'TileWidth',
	323: 'TileLength',
	324: 'TileOffsets',
	325: 'TileByteCounts',
	330: 'SubIFDs',
	332: 'InkSet',
	333: 'InkNames',
	334: 'NumberOfInks',
	336: 'DotRange',
	337: 'TargetPrinter',
	338: 'ExtraSamples',
	339: 'SampleFormat',
	340: 'SMinSampleValue',
	341: 'SMaxSampleValue',
	342: 'TransferRange',
	343: 'ClipPath',
	344: 'XClipPathUnits',
	345: 'YClipPathUnits',
	346: 'Indexed',
	347: 'JPEGTables',
	351: 'OPIProxy',
	512: 'JPEGProc',
	513: 'JpegIFOffset',
	514: 'JpegIFByteCount',
	515: 'JpegRestartInterval',
	517: 'JpegLosslessPredictors',
	518: 'JpegPointTransforms',
	519: 'JpegQTables',
	520: 'JpegDCTables',
	521: 'JpegACTables',
	529: 'YCbCrCoefficients',
	530: 'YCbCrSubSampling',
	531: 'YCbCrPositioning',
	532: 'ReferenceBlackWhite',
	700: 'XMLPacket',
	4096: 'RelatedImageFileFormat',
	4097: 'RelatedImageWidth',
	4098: 'RelatedImageLength',
	18246: 'Rating',
	18249: 'RatingPercent',
	32781: 'ImageID',
	33421: 'CFARepeatPatternDim',
	33422: 'CFAPattern',
	33423: 'BatteryLevel',
	33432: 'Copyright',
	33434: 'ExposureTime',
	33437: 'FNumber',
	33723: 'IPTCNAA',
	34377: 'ImageResources',
	34665: 'ExifOffset',
	34675: 'InterColorProfile',
	34850: 'ExposureProgram',
	34852: 'SpectralSensitivity',
	34853: 'GPSInfo',
	34855: 'ISOSpeedRatings',
	34856: 'OECF',
	34857: 'Interlace',
	34858: 'TimeZoneOffset',
	34859: 'SelfTimerMode',
	36864: 'ExifVersion',
	36867: 'DateTimeOriginal',
	36868: 'DateTimeDigitized',
	37121: 'ComponentsConfiguration',
	37122: 'CompressedBitsPerPixel',
	37377: 'ShutterSpeedValue',
	37378: 'ApertureValue',
	37379: 'BrightnessValue',
	37380: 'ExposureBiasValue',
	37381: 'MaxApertureValue',
	37382: 'SubjectDistance',
	37383: 'MeteringMode',
	37384: 'LightSource',
	37385: 'Flash',
	37386: 'FocalLength',
	37387: 'FlashEnergy',
	37388: 'SpatialFrequencyResponse',
	37389: 'Noise',
	37393: 'ImageNumber',
	37394: 'SecurityClassification',
	37395: 'ImageHistory',
	37396: 'SubjectLocation',
	37397: 'ExposureIndex',
	37398: 'TIFF/EPStandardID',
	37500: 'MakerNote',
	37510: 'UserComment',
	37520: 'SubsecTime',
	37521: 'SubsecTimeOriginal',
	37522: 'SubsecTimeDigitized',
	37888: 'AmbientTemperature',
	37889: 'Humidity',
	37890: 'Pressure',
	37891: 'WaterDepth',
	37892: 'Acceleration',
	37893: 'CameraElevationAngle',
	40091: 'XPTitle',
	40092: 'XPComment',
	40093: 'XPAuthor',
	40094: 'XPKeywords',
	40095: 'XPSubject',
	40960: 'FlashPixVersion',
	40961: 'ColorSpace',
	40962: 'ExifImageWidth',
	40963: 'ExifImageHeight',
	40964: 'RelatedSoundFile',
	40965: 'ExifInteroperabilityOffset',
	41483: 'FlashEnergy',
	41484: 'SpatialFrequencyResponse',
	41486: 'FocalPlaneXResolution',
	41487: 'FocalPlaneYResolution',
	41488: 'FocalPlaneResolutionUnit',
	41492: 'SubjectLocation',
	41493: 'ExposureIndex',
	41495: 'SensingMethod',
	41728: 'FileSource',
	41729: 'SceneType',
	41730: 'CFAPattern',
	41985: 'CustomRendered',
	41986: 'ExposureMode',
	41987: 'WhiteBalance',
	41988: 'DigitalZoomRatio',
	41989: 'FocalLengthIn35mmFilm',
	41990: 'SceneCaptureType',
	41991: 'GainControl',
	41992: 'Contrast',
	41993: 'Saturation',
	41994: 'Sharpness',
	41995: 'DeviceSettingDescription',
	41996: 'SubjectDistanceRange',
	42016: 'ImageUniqueID',
	42032: 'CameraOwnerName',
	42033: 'BodySerialNumber',
	42034: 'LensSpecification',
	42035: 'LensMake',
	42036: 'LensModel',
	42037: 'LensSerialNumber',
	42240: 'Gamma',
	50341: 'PrintImageMatching',
	50706: 'DNGVersion',
	50707: 'DNGBackwardVersion',
	50708: 'UniqueCameraModel',
	50709: 'LocalizedCameraModel',
	50710: 'CFAPlaneColor',
	50711: 'CFALayout',
	50712: 'LinearizationTable',
	50713: 'BlackLevelRepeatDim',
	50714: 'BlackLevel',
	50715: 'BlackLevelDeltaH',
	50716: 'BlackLevelDeltaV',
	50717: 'WhiteLevel',
	50718: 'DefaultScale',
	50719: 'DefaultCropOrigin',
	50720: 'DefaultCropSize',
	50721: 'ColorMatrix1',
	50722: 'ColorMatrix2',
	50723: 'CameraCalibration1',
	50724: 'CameraCalibration2',
	50725: 'ReductionMatrix1',
	50726: 'ReductionMatrix2',
	50727: 'AnalogBalance',
	50728: 'AsShotNeutral',
	50729: 'AsShotWhiteXY',
	50730: 'BaselineExposure',
	50731: 'BaselineNoise',
	50732: 'BaselineSharpness',
	50733: 'BayerGreenSplit',
	50734: 'LinearResponseLimit',
	50735: 'CameraSerialNumber',
	50736: 'LensInfo',
	50737: 'ChromaBlurRadius',
	50738: 'AntiAliasStrength',
	50739: 'ShadowScale',
	50740: 'DNGPrivateData',
	50741: 'MakerNoteSafety',
	50778: 'CalibrationIlluminant1',
	50779: 'CalibrationIlluminant2',
	50780: 'BestQualityScale',
	50781: 'RawDataUniqueID',
	50827: 'OriginalRawFileName',
	50828: 'OriginalRawFileData',
	50829: 'ActiveArea',
	50830: 'MaskedAreas',
	50831: 'AsShotICCProfile',
	50832: 'AsShotPreProfileMatrix',
	50833: 'CurrentICCProfile',
	50834: 'CurrentPreProfileMatrix',
	50879: 'ColorimetricReference',
	50931: 'CameraCalibrationSignature',
	50932: 'ProfileCalibrationSignature',
	50934: 'AsShotProfileName',
	50935: 'NoiseReductionApplied',
	50936: 'ProfileName',
	50937: 'ProfileHueSatMapDims',
	50938: 'ProfileHueSatMapData1',
	50939: 'ProfileHueSatMapData2',
	50940: 'ProfileToneCurve',
	50941: 'ProfileEmbedPolicy',
	50942: 'ProfileCopyright',
	50964: 'ForwardMatrix1',
	50965: 'ForwardMatrix2',
	50966: 'PreviewApplicationName',
	50967: 'PreviewApplicationVersion',
	50968: 'PreviewSettingsName',
	50969: 'PreviewSettingsDigest',
	50970: 'PreviewColorSpace',
	50971: 'PreviewDateTime',
	50972: 'RawImageDigest',
	50973: 'OriginalRawFileDigest',
	50974: 'SubTileBlockSize',
	50975: 'RowInterleaveFactor',
	50981: 'ProfileLookTableDims',
	50982: 'ProfileLookTableData',
	51008: 'OpcodeList1',
	51009: 'OpcodeList2',
	51022: 'OpcodeList3',
	51041: 'NoiseProfile'
}

使用PIL库时,一幅图像数据Exif信息的获取可通过getexif方法获得。

from PIL import Image
img = Image.open("./m.jpg")
print(img.getexif())
{
	34665: 290,
	36864: b '0210',
	37121: b '\x01\x02\x03\x00',
	37377: 29.8973,
	36867: '2020:09:02 23:02:43',
	36868: '2020:09:02 23:02:43',
	37378: 2.52,
	37379: 0.0,
	37380: 0.0,
	37383: 5,
	37384: 1,
	37385: 24,
	37386: 3.38,
	40961: 1,
	40962: 2448,
	40965: 8434,
	41990: 0,
	37520: '438870',
	37521: '438870',
	37522: '438870',
	40963: 3264,
	41996: 0,
	41495: 2,
	41728: b '\x03',
	33434: 0.04,
	33437: 2.4,
	41729: b '\x01',
	34850: 2,
	41985: 1,
	34855: 250,
	41986: 0,
	40960: b '0100',
	41987: 0,
	41988: 1.0,
	41989: 26,
	41991: 0,
	41992: 0,
	41993: 0,
	41994: 0,
	37500: b 'Auto\x00',
	296: 2,
	282: 72.0,
	256: 2448,
	257: 3264,
	258: (8, 8, 8),
	34853: {
		0: b '\x02\x02\x00\x00',
		1: 'N',
		2: (22.0, 38.0, 54.697723),
		3: 'E',
		4: (114.0, 3.0, 35.029907),
		5: b '\x01',
		6: 0.0,
		7: (15.0, 2.0, 42.0),
		27: 'CELLID',
		29: '2020:09:02'
	},
	41995: b 'ipp\x00',
	270: 'bty',
	271: 'HUAWEI',
	272: 'KNT-UL10',
	305: 'KNT-UL10 8.0.0.556(C00)',
	274: 0,
	306: '2020:09:02 23:02:43',
	531: 1,
	283: 72.0
}

譬如274表示orientation。其处理可参考5

参考:
1.https://zh.wikipedia.org/wiki/Exif
2.https://zhuanlan.zhihu.com/p/366726838
3.https://baike.baidu.com/item/EXIF%E4%BF%A1%E6%81%AF/3297493
4.https://mp.weixin.qq.com/s?__biz=MzAxNTc4MTc1Ng==&mid=2649395978&idx=2&sn=9d19517b41e30069787c6998924fb850&chksm=83e0e919b497600fb7a630b0474f9b4a25866f997b6c4eca359c70cee8a6bf9aeead22a4f589&mpshare=1&scene=1&srcid=1008W3nbLinwcMZgf49emKar&sharer_sharetime=1633664055894&sharer_shareid=715337ab6f6483872d17f37de2f7e4bf&notreplace=true&exportkey=A0i5QEYtCX3RYqAQLZ%2B%2FfNg%3D&pass_ticket=evQ%2BD4tN43xMZl5Nol%2BrBPpJxKHbPr9OuEQIL6mbg3eRRC%2F%2BbEwUDklPhQa8gB4M&wx_header=0#rd
5.https://github.com/ageitgey/image_to_numpy

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
部分使用说明: 点击开始菜单-运行命令,在对话框输入: "jhead –命令参数 jpeg文件" 例如: “jhead -de D:\A.jpg” 删除D盘盘根目录下A.jpg文件的exif信息。 “jhead -de D:\*.jpg” 删除D盘根目录下所有jpg文件的exif信息。其星号是通配符。 二、通用指令参数 -te 将其他jpeg文件的eixf导入目标jpeg。例如"jhead –te D:\B.jpg D:\A.jpg" -dc 删除jpeg信息的备注。注意,jpeg文件有两个备注,一是和其他文件一样的备注,另一个是exif信息的备注。jhead仅对exif信息有效。 -de 完全删除exif信息。 -du 删除非原始exif信息,例如Photoshop、Turbophoto之类编辑后修改exif留下的信息。 -purejpg 删除所有jpeg文件非必须的信息。相当于-de、-dc和-du的集合,可以将文件减小数k。 -ce 修改文件的jpeg文件头部分备注(此备注并非exif信息)。该指令会打开文本编辑器,并在编辑器关闭时将备注信息存入文件。 -cs 导出备注。例如"jhead –cs D:\988.txt D:\A.jpg" -ci 导入备注。例如"jhead –ci D:\988.txt D:\A.jpg" -cl 直接输入备注。。例如"jhead –cl 我的备注 D:\A.jpg" 三、其他指令 时间日期 -ft 将jpeg文件的“修改时间”修改为exif信息记录的时间。 -n[] 该指令会将文件名修改为exif信息记录的“创建时间”;如果jpeg文件没有exif或者exif的创建时间不可用,则将文件名修改为文件的“修改时间”。 默认的格式-顺序为MMDD-HHMMSS 格式-顺序参数如下: %d-日(01-31) %H-小时(00-23) %j-一年的第几天(001-366) %m-月(01-12) %M-分钟(00-59) %S-秒(00-59) %U-一年的第几周(00-53) %w-星期几(0-6,周日为0) %y-两位数纪年(00-99) %Y-四位数几年 %i-添加数字序号 例如: jhead -n%Y%m%d-%H%M%S d:\*.jpg 将所有jpg文件修改为YYYYMMDD-HHMMSS.jpg的格式。 -nf 与“-n”相同功能相同,不保留原文件名。 -a 修改不同扩展名的同名文件名,相机拍摄的avi短片exif信息存储在与其同名的thm文件,可用此指令给avi文件更名。一般与“-n”指令共同使用。 -ta 修正时差,例如时差根据时区确定,例如+1:00或者-1:00 -da- 修正日期。日期格式是yyyy:mm:dd、yyyy:nn:dd+hh:mm或者 yyyy:mm:dd+hh:mm:ss。根据前后参数时间差调整exif的时间。 -ts 直接修改exif的拍摄时间,日期-时间格式为yyyy:mm:dd-hh:mm:ss 缩略图 -dt 删除exif的缩略图。这个缩略图一般为240x160像素,10k大小,用于数码相机、Windows XP查看照片,删除它不会影响工作。 -st 将exif的缩略图复制为另一个jpeg文件 -rt 用另一个jpeg文件替换exif的缩略图 -rgt[大小] 刷新exif缩略图,其大小为缩略图的最大边长。 旋转 -autorot 根据exif记录的水平方向信息转动jpeg照片。 -norot 清除exif的水平方向信息。 四、使用技巧 1)用开始菜单的"运行"指令并不直观,可以通过运行cmd命令进入DOS命令提示符界面操作。在DOS界面进入操作照片文件夹(不懂DOS操作的朋友建议稍稍学习DOS指令,今后也会受用无穷),在文件夹运行jhead命令,用“*.jpg”表示文件夹所有的jpeg文件,可以进行批处理。 2)-te(复制exif信息)作用在于可以恢复被其他编辑软件删除的exif信息。编辑照片之前,先在照片文件夹建立一个名为“backup”的备份文件夹,将原是照片复制到backup文件夹,然后再编辑照片,编辑软件可能会删除或修改exif。编辑结束后进入DOS界面照片文件夹输入: jhead –te “backup\&i” *.jpg 照片的exif信息就会从backup文件夹的原始文件复制回来。其“&i”表示与目标文件同名的文件,前面的“backup\”表示原始文件位置。 3)-purejpg指令可以删除所有exif信息,让照片减小若干k字节
快速访问您查看的任何图像EXIF数据 快速访问您在Google Chrome浏览器查看的任何图像EXIF数据如何使用它? -右键单击任何图像/图片-选择“显示Exif数据”-然后在浏览器右侧的单独面板显示图像/ exif信息。 顶级功能:-完全免费-只需单击鼠标右键即可获得各种信息-预览图像详细信息-支持300多个摄像头-直方图或RGB颜色重构-将exif信息自动复制到剪贴板-共享重要更新的通知-其他功能即将推出…-99%的网站不受影响。 帮助我们解决任何问题-无需注册或登录要测试什么? 在http://bit.ly/2cOdqNT上尝试这些图片http://bit.ly/2cOcvNN、http://bit.ly/2cOdD3E及更多内容权限:-此应用需要读取权限才能提供一些高级功能功能。 *没有广告软件。 没有间谍软件。 别吵了。 支持链接:http://tiny.cc/extsupport ==========当前问题========== 1.破坏了一些网站吗? -任何导入了一些(require-js)javascript的网站都可能会受到影响-解决方案:2016年10月17日,我们对其进行了修复,希望它可以解决所有问题2。PDF未打开-以.pdf结尾的所有网址均已修复-像来自Drive的蒸出的PDF文件不受影响-其他格式的PDF可以在此处进行验证-http://bit.ly/2d8lStp-如果有任何问题,请在http://tiny.cc/extsupport上共享详细信息/链接。3. CSS破解某些网站-我们已于2016年9月21日修复此问题,希望它不会破解任何新CSS其他问题? 请在http://tiny.cc/extsupport上报告它们。===============常见问题解答=============== 1.某些网站为何崩溃? -由于此扩展程序需要某些(jQuery)库才能工作,并且可能与网站的导入相互冲突。2.是否注入/ css? -是的,因为它是一个集成的扩展,需要直接从浏览器DOM处理内容-它仅注入提供EXIF数据功能所需的脚本/ css ============更改日志== ========== 2.4.1-现在支持大多数PDF格式而不会断-固定/覆盖加载图像的问题已得到修复-网站断的问题(很少)现在终于得到了修复2.4.0-修复了该问题CSS规则破坏了一些网站-增加了内容空间2.3.8 / 9-UI增强2.3.7-修复了曾经破坏两个网站的require-jquery.js问题2.3.6-PDF问题不可复制,请在此处进行验证-http://bit.ly/2d8lStp,并在http://tiny.cc/extsupport上报告任何问题2.3.5-修复了缺少的相机图片细节2.3.4-改进了外观-通知支持-修复了PDF开放性问题(Ref-http://prntscr.com/cj3h7i)2.2-更新了摄像头模型-添加了新的exif属性2.1-UI更新-附加验证2.0-直方图支持-错误 修复-复制到剪贴板选项1.5。*-额外的相机支持1. *-基本的exif信息显示需要快速帮助吗? 通过-http://tiny.cc/extsupport与我们联系 支持语言:English,Français,Tiếng Việt,Ελληνικά,русский,文 (繁體)
可以使用开源库libexif来实现将经纬度写入图像exif信息。具体实现可以参考以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <exif-data.h> int main(int argc, char **argv) { if (argc < 4) { printf("Usage: %s <image_file> <latitude> <longitude>\n", argv[0]); return 1; } const char *image_file = argv[1]; double latitude = atof(argv[2]); double longitude = atof(argv[3]); ExifData *exif_data = exif_data_new_from_file(image_file); if (!exif_data) { printf("Failed to read exif data from %s\n", image_file); return 1; } ExifByteOrder byte_order = exif_data_get_byte_order(exif_data); ExifEntry *entry_latitude = exif_data_get_entry(exif_data, EXIF_TAG_GPS_LATITUDE); ExifEntry *entry_longitude = exif_data_get_entry(exif_data, EXIF_TAG_GPS_LONGITUDE); ExifEntry *entry_latitude_ref = exif_data_get_entry(exif_data, EXIF_TAG_GPS_LATITUDE_REF); ExifEntry *entry_longitude_ref = exif_data_get_entry(exif_data, EXIF_TAG_GPS_LONGITUDE_REF); if (!entry_latitude || !entry_longitude || !entry_latitude_ref || !entry_longitude_ref) { printf("Failed to get exif entries for latitude and longitude\n"); exif_data_unref(exif_data); return 1; } char latitude_ref = latitude >= 0 ? 'N' : 'S'; char longitude_ref = longitude >= 0 ? 'E' : 'W'; exif_set_rational(entry_latitude, byte_order, (ExifRational[]){{abs(latitude) * 1000000, 1000000}}, 1); exif_set_rational(entry_longitude, byte_order, (ExifRational[]){{abs(longitude) * 1000000, 1000000}}, 1); exif_set_string(entry_latitude_ref, byte_order, &latitude_ref); exif_set_string(entry_longitude_ref, byte_order, &longitude_ref); exif_data_save_data(exif_data, NULL, 0); exif_data_unref(exif_data); printf("Latitude and longitude written to exif data of %s\n", image_file); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值