修改图像元数据

2023-11-23

我正在尝试修改 JPEG 图像中包含的元数据。它可以是图像中的任何元数据,在我的示例中,我尝试更改为DateTimeDigitized财产到当前日期。

我的代码似乎大部分工作,但是设置的属性被删除而不是更改。我不确定为什么会发生这种情况,谁能告诉我我做错了什么?

我欢迎任何有关有助于执行任务的框架的建议,但我特别感兴趣的是我用这种方法做错了什么。

我在 Playground 中运行此代码,其中名为“foo.jpg”的图像存储在路径中~/Documents/Shared Playground Data/.

import Foundation
import ImageIO            // CGImage functions
import PlaygroundSupport

let ImagePropertyExifDictionary = kCGImagePropertyExifDictionary as String
let ImagePropertyExifDateTimeDigitized = kCGImagePropertyExifDateTimeDigitized as String

func updateEXIFDateDigitized() {
  // Create URL for source and destination
  let sourceURL = playgroundSharedDataDirectory.appendingPathComponent("foo.jpg") as CFURL
  let destinationURL = playgroundSharedDataDirectory.appendingPathComponent("bar.jpg") as CFURL

  // Read source and get properties
  guard
    let sourceRef = CGImageSourceCreateWithURL(sourceURL, nil),
    var metadata = CGImageSourceCopyPropertiesAtIndex(sourceRef, 0, nil) as? [String:Any] else { return }

  print("unmodified properties", metadata, separator:"\n")

  // Modify EXIF DateTimeDigitized property
  guard var exif = metadata[ImagePropertyExifDictionary] as? [String:Any] else { return }

  exif[ImagePropertyExifDateTimeDigitized] = Date() as CFDate
  metadata[ImagePropertyExifDictionary] = exif as CFDictionary
  print("", "modified properties", metadata, separator:"\n")

  // Set up destination
  guard let destinationRef = CGImageDestinationCreateWithURL(destinationURL, kUTTypeJPEG, 1, nil) else { return }

  // Add image from source to destination with new properties
  CGImageDestinationAddImageFromSource(destinationRef, sourceRef, 0, metadata as CFDictionary)

  // Save destination
  guard CGImageDestinationFinalize(destinationRef) else { return }

  guard
    let sourceRef2 = CGImageSourceCreateWithURL(destinationURL, nil),
    let metadata2 = CGImageSourceCopyPropertiesAtIndex(sourceRef2, 0, nil) else { return }

  print("", "saved properties", metadata2, separator:"\n")
}

updateEXIFDateDigitized()

结果的相关位,为了简洁起见,我删除了其他字段:

unmodified properties
{
  "{Exif}" =     {
    DateTimeDigitized = "2007:07:31 17:42:01";
    DateTimeOriginal = "2007:07:31 17:42:01";
  };
}

modified properties
{
  "{Exif}" =     {
    DateTimeDigitized = "2017-05-11 15:45:38 +0000";
    DateTimeOriginal = "2007:07:31 17:42:01";
  };
}

saved properties
{
  "{Exif}" =     {
    DateTimeOriginal = "2007:07:31 17:42:01";
  };
}

我自己回答这个问题,因为我发现了为什么它没有保存数据,而且看起来这个问题可以帮助其他人。

我的代码是正确的,唯一的问题是我没有正确格式化日期。由于日期的格式不正确,它被框架修剪了。我像这样设置日期格式,它保存并正确显示:

let formatter = DateFormatter()
formatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
exif[ImagePropertyExifDateTimeDigitized] = formatter.string(from: Date())

这是代替该行的:

exif[ImagePropertyExifDateTimeDigitized] = Date() as CFDate

现在的输出是(再次修剪为仅相关属性):

unmodified properties
  {
    "{Exif}" =     {
      DateTimeDigitized = "2007:07:31 17:42:01";
      DateTimeOriginal = "2007:07:31 17:42:01";
    };
}

modified properties
  {
    "{Exif}" =     {
      DateTimeDigitized = "2017:05:12 01:04:14";
      DateTimeOriginal = "2007:07:31 17:42:01";
    };
}

saved properties
  {
    "{Exif}" =     {
      DateTimeDigitized = "2017:05:12 01:04:14";
      DateTimeOriginal = "2007:07:31 17:42:01";
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改图像元数据 的相关文章

  • swift 中 pch 的替代品是什么?

    我想知道可以用什么来代替 swift 中的 pch 有没有 pch 的替代方案或方法可以快速摆脱导入 这样我们就不需要对所有类都这样做 我不想一直随身携带 进口 swift 中 pch 的最佳替代品是什么 您无法在 swift 中定义 宏
  • 为什么 CABasicAnimation 尝试初始化我的自定义 CALayer 的另一个实例?

    我收到此错误 致命错误 对类 MyProject AccordionLayer 使用未实现的初始化程序 init layer 使用以下代码 在我的视图控制器中 override func viewDidLoad let view self
  • Xcode 8:使用 iOS 9.3 基础 SDK 编译?

    我在 Xcode 8 0 beta 8S128d 中将 iOS 应用程序升级到 Swift 3 0 我以为一切都已准备就绪 并将其上传到 iTunes Connect 当我点击 提交审核 时 它给了我一个包含 26 个错误的列表 每个嵌入式
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • 如何从TableViewCell上的自定义CollectionViewCell推送VC?

    我有一个tableView和细胞 在细胞上我有一个collectionView并在其上显示一些内容 我想发送一个有关选择的链接indexPath 我想从自定义中推送 呈现我的视图CollectionViewCell这是在TableViewC
  • Swift:如何让游戏中的角色只有落地后才能跳跃?

    我正在开发一款游戏 我的角色可以从一个陆地跳到另一个陆地 我已经把所有事情都做好了 除了我剩下的问题是 如果你继续点击屏幕 他可以永远跳跃 我希望他必须先落地才能再次跳跃 import SpriteKit import GameplayKi
  • iOS 确定视频中的帧数

    如果我有一个 Swift 中的 MPMoviePlayerController MPMoviePlayerController mp MPMoviePlayerController contentURL url 有没有办法获取视频中的帧数u
  • 如何使用逗号和行分隔符对字符串进行标记

    我正在 Swift 中制作一个简单的 String Tokenizer 就像在 Java 中一样 但这对我来说确实不起作用 我的数据源中每行的末尾用 分隔 数据用逗号分隔 例如 字符串 1 字符串 2 字符串 3 字符串 1 字符串 2 字
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • 上下文菜单未在 SwiftUI 中更新

    我正在尝试设置 SwiftUI contextMenu带有一个切换按钮Bool价值 上下文菜单的按钮文本应该在以下情况下更改 Bool切换 但上下文菜单不会更新 有没有办法强制更新上下文菜单 描述问题的示例代码 import SwiftUI
  • Swift 中计算只读属性与函数

    在 Swift WWDC 简介会话中 只读属性description被证明 class Vehicle var numberOfWheels 0 var description String return numberOfWheels wh
  • 自动生成的 Swift 桥接标头中“找不到接口声明”

    我当前的项目包含 Swift 和 Objective C 代码 两种类型的源文件都使用另一种语言的代码 当我进行完全清理并重新编译时 几乎每个 Swift 类声明都出现错误Module Swift h 形式为 Cannot find int
  • 在 Swift UI 中为文本添加动画

    怎么可能动画化Text or TextField来自 Swiftui 的意见 我所说的动画是指 当文本发生变化时 它会 计数 例如 给定一些标签 如何创建一个动画 当我将标签文本设置为 100 时 它会从 0 上升到 100 我知道这在 U
  • 重新定位时 Mapbox 默认的 compassView 会给出奇怪的结果

    我遇到一种情况 必须将地图框罗盘视图重新定位到不同的位置 当我以其他点作为其 compassView 轴旋转地图时 compassView 现在正在旋转 并给了我一个奇怪的结果 附截图 黑色mapBox默认罗盘图标是旋转的 参考截图 这是
  • Swift 3 GCD API 更改后的dispatch_once

    新语法是什么dispatch once在语言版本 3 中进行更改后的 Swift 中 旧版本如下 var token dispatch once t 0 func test dispatch once token These 对 libdi
  • iOS swift 应用程序启动时出现黑屏

    我有个问题 当我启动我的应用程序时 会看到黑屏几秒钟 然后出现启动屏幕 我的启动画面不是默认的 我使用了视图控制器 因为我的启动画面有一个动画 我搜索了一个解决方案 我得到了这个 在我的闪屏加载 iPhone 之前出现黑屏 https st
  • Braintree DropIn + Apple Pay,未出现 Apple Pay 项目

    我成功调用DropIn来自 Braintree SDK 的视图 这BTDropInRequest设置应显示三项 PayPal 信用卡 苹果支付 但由于某种原因在DropIn视图仅呈现两个项目而不是三个 PayPal 信用卡 我做错了什么 准
  • 错误:“Int”无法转换为“@lvalue Float”

    给定以下函数 func greatestCommonDenominator first Int second Int gt Int return second 0 first greatestCommonDenominator second
  • 搜索TableView无法选择行

    在搜索 tableView 时 每次我尝试选择一行时 它都会返回到未搜索的 tableView 我缺少什么 当不过滤表格时 segue 工作得很好 当搜索栏被激活时 选择行的能力就会消失 import UIKit import Founda
  • CNContact 添加新的联系人问题

    我在通过以下方式添加联系人时遇到问题联系框架 我使用的是装有 iOS 12 1 2 的 iPhone 5s 设备 我添加联系人的代码如下 let saveRequest CNSaveRequest saveRequest add self

随机推荐