【问题标题】:How to get dpi/ppi of UIImage?如何获取 UIImage 的 dpi/ppi?
【发布时间】:2013-11-14 08:35:43
【问题描述】:

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

【问题讨论】:

  • 数字图像没有 DPI 或 PPI。阅读此dpiphoto.eu/dpi.htm
  • NSData 只是二进制数据,就 UIImage 而言,您可能想看看这个stackoverflow.com/questions/15336789/…
  • @borrrden 当数字图像与物理对象相关时,肯定有存储 DPI 的潜力,虽然大多数应用程序不需要它,但有些应用程序需要它。例如扫描的文档。

标签: ios objective-c


【解决方案1】:

要从存储在 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 了解更多信息。

【讨论】:

  • 这个答案是什么都没有。它始终为空,检查了 50 个不同的图像 NSData。
  • @Curnelious 正如我在回答中指出的那样,这是因为创建图像的软件。我向您保证,有些图像确实具有 DPI,我每天都使用此代码来提取该 DPI。很多时候 DPI 对软件或人来说并不重要,所以有些程序不会费心添加它。有些人甚至错误地认为 DPI 不再重要。对我来说,它主要是在将文档图像与我要在其上光栅化的一些新文本相关联时发挥作用,但这对大多数人来说并不常见。
  • 您应该使用清单常量 kCGImagePropertyDPIHeightkCGImagePropertyDPIWidth 而不是字符串文字。此外,文档说属性值对象将是 CFNumbers(由于免费桥接,您可以将其类型转换为 NSNumber),而不是字符串。
【解决方案2】:

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

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

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

How to get image metadata in ios

【讨论】:

  • 这个答案的 Swift 版本?
【解决方案3】:

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)   

【讨论】:

  • "PixelWidth" 代替 DPIWidth 在这里工作
  • 如果 DPIWidth 不起作用,则表示 imageData 中没有 DPI 信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多