cocoa - 如何在Cocoa中修改EXIF数据而不压缩图像?

标签 cocoa core-graphics

我已成功使用 CGImageSource 读取图像(主要是 JPEG)并使用 CGImageDestination 将其写回。它有效,但我的图像比以前小很多(3.9Mb 的图像将变成 2.1Mb 的图像)。

我一直在玩kCGImageDestinationLossyCompressionQuality虽然它确实影响文件的大小,但我不明白它使用的比例。

例如同一个 3.7Mb 文件的大小将更改为:

  • 1.9Mb,压缩质量为0.7

  • 2.4Mb,压缩质量为0.8

  • 3.0Mb,压缩质量为0.9

  • 7.4Mb,压缩质量为 1.0

我尝试了一切(使用二分法到小数点后 6 位)来找到回到神奇的 3.9Mb 的最佳位置,但它从 3.3Mb 跳到 7.4Mb,似乎没有办法让它保持在这两个数字之间.

是否有任何其他 Objective-C 库可以用来修改 EXIF 数据,而无需考虑压缩(以及文件大小)?

最佳答案

使用 CGImageDestination 您正在创建一个新图像,并且新创建的图像的大小很难与原始图像匹配。 (取决于压缩级别)。

如果您只需要修改原始图片中的元数据,而不更改图像信息,则应该使用其他库。我知道其中两个可以在 cocoa 应用程序中使用:

  • libexif C++ 库。支持写入jpg。 LGPL 许可证。
  • exiv2 C++。支持写入多种格式。但它需要一个 如果您在商业应用程序中使用它,则需要付费许可证。

另一个选择是使用 exiftool 。它是一个 Perl 脚本,已成为更改元数据信息的事实上的标准。您可以将其包含在应用程序的资源文件夹中,并使用 NSTask 调用它来更改图片的元数据。非常容易做到,并且是迄今为止这三个工具中最好的工具。 (仅适用于 Mac,不确定您的目标是 iPhone 还是 Mac)

关于cocoa - 如何在Cocoa中修改EXIF数据而不压缩图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8024111/

相关文章:

ios - CGContextSetShadow UITableViewCell 性能

objective-c - 核心显卡-drawRect : not getting called frequently enough

ios - NSString 绘制矩形 : and drop shadows on iOS

objective-c - Objective-C 中接受的重试 URL 请求的方法?

objective-c - NSScrollView:像 Messages.app 一样淡入顶部边框

iphone - 河豚算法 objective-c

swift - 如何处理鼠标输入: events on an NSView with rounded corners

xcode - CGContextSaveGState : invalid context 0x0 Error only on device

ios - 裁剪像素缓冲区

macos - Cocoa OSX 在拖动操作期间设置光标