如何在 iOS 中获取图像的 dpi/ppi?也许原始图像文件包含这些信息,所以我可以从 NSData 获取 ppi/dpi?谢谢你。
3 回答
要从存储在 NSData 中的图像中提取 DPI,请在您的项目中包含 Apple 的 ImageIO 框架并使用以下内容:
#import <ImageIO/ImageIO.h>
// Set your NSData up
NSData *data = some image data
// Get the DPI of the image
CGImageSourceRef imageRef = CGImageSourceCreateWithData((__bridge CFDataRef)(data), NULL);
CFDictionaryRef imagePropertiesDict = CGImageSourceCopyPropertiesAtIndex(imageRef, 0, NULL);
NSString *dpiHeight = CFDictionaryGetValue(imagePropertiesDict, @"DPIHeight");
NSString *dpiWidth = CFDictionaryGetValue(imagePropertiesDict, @"DPIWidth");
请注意,并非所有图像都包含 DPI 信息。它可能包含在图像的元数据中,也可能不包含。
此答案基于 Flar49 的答案,该答案是正确的,但经过增强以直接从 NSData 获取信息。有关详细信息,请参阅http://iosdevelopertips.com/data-file-management/get-image-data-including-depth-color-model-dpi-and-more.html。
Objective-C
获取图像分辨率:
CGFloat imageResolution = myImage.scale * 72.0f;
从“标准” UIImage ( 72 dpi ) 创建 300dpi 的图像:
UIImage *my300dpiImage = [UIImage imageWithCGImage:mySourceImage.CGImage scale:300.0f/72.0f orientation:UIImageOrientationUp] ;
迅速
获取分辨率:
let imageResolution = myImage.scale * 72.0
更改图像分辨率:
// Just be sure source image is valid
if let source = mySourceImage, let cgSource = source.cgImage {
let my300dpiImage = UIImage(cgImage: cgSource, scale: 300.0 / 72.0, orientation: source.imageOrientation)
}
请注意,我在 swift 示例中添加了对源图像方向的尊重,还请注意,将分辨率从 72 更改为 300 dpi 会导致质量损失,因为您没有图片细节。
重要的是,除非图像被渲染,否则分辨率并不意味着什么。在此之前,你得到了你得到的位。你可以通过设置目标矩形大小来确定最终分辨率,如查看器所见。
由创建者应用程序确定的文件分辨率不在图像数据本身,而是在元数据中。如上一个答案或以下地址所述:
Swift 5 解决方案:您可以从图像元数据中获取 DPI 信息。 imageData是 NSData 类型。
guard let imageSource = CGImageSourceCreateWithData(imageData, nil),
let metaData = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [String: Any],
let dpi = metaData["DPIWidth"] as? Int else {
return
}
print(dpi)