5

如何在 iOS 中获取图像的 dpi/ppi?也许原始图像文件包含这些信息,所以我可以从 NSData 获取 ppi/dpi?谢谢你。

4

3 回答 3

5

要从存储在 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

于 2014-05-29T21:34:49.253 回答
3

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 会导致质量损失,因为您没有图片细节。

重要的是,除非图像被渲染,否则分辨率并不意味着什么。在此之前,你得到了你得到的位。你可以通过设置目标矩形大小来确定最终分辨率,如查看器所见。

由创建者应用程序确定的文件分辨率不在图像数据本身,而是在元数据中。如上一个答案或以下地址所述:

如何在ios中获取图像元数据

于 2014-12-21T08:58:18.347 回答
0

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)   
于 2019-05-16T13:28:12.047 回答