gpt4 book ai didi

ios - 如何创建带有 DPI 集的 UIImage?

转载 作者:行者123 更新时间:2023-11-28 06:48:50 24 4
gpt4 key购买 nike

我有一个 UIImage,我希望将它保存到具有 DPI 元数据集的照片中。我知道 UIImage 是不可变的,所以我必须创建一个新的 UIImage。我用过 this answer作为在 UIImage 上创建快速扩展功能的引用,该功能会生成带有 DPI 集的新 UIImage。我使用 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 成功地将它保存到照片中。我通过电子邮件将其发送给自己(设置为“实际大小”)并在预览中打开它,但 DPI 始终保持在 72。

这是我转换的函数:

func imageWithDPI(dpi :Int) -> UIImage? {
guard let sourceImageData = UIImageJPEGRepresentation(self, 0.8) else {
print("Couldn't make PNG Respresentation of UIImage")
return nil
}

guard let source = CGImageSourceCreateWithData(sourceImageData, nil) else {
print("Couldn't create source with sourceImageData")
return nil
}

var metadata = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String:AnyObject] ?? [String:AnyObject]()
metadata[kCGImagePropertyDPIWidth as String] = dpi
metadata[kCGImagePropertyDPIHeight as String] = dpi

var exifDictionary = metadata[kCGImagePropertyTIFFDictionary as String] as? [String:AnyObject] ?? [String:AnyObject]()
exifDictionary[kCGImagePropertyTIFFXResolution as String] = dpi
exifDictionary[kCGImagePropertyTIFFYResolution as String] = dpi
metadata[kCGImagePropertyTIFFDictionary as String] = exifDictionary

var jfifDictionary = metadata[kCGImagePropertyJFIFDictionary as String] as? [String:AnyObject] ?? [String:AnyObject]()
jfifDictionary[kCGImagePropertyJFIFXDensity as String] = dpi
jfifDictionary[kCGImagePropertyJFIFYDensity as String] = dpi
jfifDictionary[kCGImagePropertyJFIFVersion as String] = 1
metadata[kCGImagePropertyJFIFDictionary as String] = jfifDictionary

guard let uti = CGImageSourceGetType(source) else {
print("Couldn't get type from source")
return nil
}

let destinationImageData = NSMutableData()
guard let destination = CGImageDestinationCreateWithData(destinationImageData, uti, 1, nil) else {
print("Couldn't create destination with destinationImageData")
return nil
}

CGImageDestinationAddImageFromSource(destination, source,0, metadata)
CGImageDestinationFinalize(destination)

return UIImage(data: destinationImageData)
}

我对 Core Graphics 有点不了解,所以任何建议都将不胜感激。

非常感谢。

最佳答案

当您从 destinationImageData 创建图像时,UIImage 可能会从图像中剥离所有元数据,包括 DPI。我最近在通过 iOS 的 UIActivityItemProvider API 共享图像时遇到了这个问题。如果我从 - (id)item 方法返回一个 UIImage * 那么所有的元数据都会丢失。解决方法是返回 NSData *NSURL *

尝试直接返回 destinationImageData,或将其保存到文件中并通过电子邮件发送给自己。

我很好奇为什么要为图像设置 DPI?如今,DPI 对于几乎所有数字图像来说几乎毫无意义(除非图像旨在准确表示物理对象的尺寸)。实际像素分辨率远比 DPI 重要。

关于ios - 如何创建带有 DPI 集的 UIImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461013/

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