无需解码即可快速读取 jpeg 的高度宽度和文件大小的方法

fast way to read height width and file size of jpeg without decoding

我有一个 jpeg 列表,我需要检查它们是否小于 4096 像素以及文件大小是否小于 4MB。我不需要显示图像,所以加载完整文件并对其进行解码有点矫枉过正。

是否可以os从元数据和文件大小中仅获取高度、宽度?

在 mac os 和 swift

文件大小可以通过FileManager API检查。

可以通过 CGImageSource 函数 (ImageIO.framework) 检查图像的宽度和高度,而无需将图像加载到内存中:

do {
    let attribute = try FileManager.default.attributesOfItem(atPath: filePath)

    // Filesize
    let fileSize = attribute[FileAttributeKey.size] as! Int

    // Width & Height
    let imageFileUrl = URL(fileURLWithPath: filePath)
    if let imageSource = CGImageSourceCreateWithURL(imageFileUrl as CFURL, nil) {
        if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? {

            let width = imageProperties[kCGImagePropertyPixelWidth] as! Int
            let height = imageProperties[kCGImagePropertyPixelHeight] as! Int

            if (height > 4096 || width > 4096 || height < 256 || width < 256) {
                print("Size not valid")
            } else {
                print("Size is valid")
            }
        }
    }

} catch {
    print("File attributes cannot be read")
}

方法是扫描图像的 SOFx 标记。 SOF市场包含图像大小。

提供标记结构的众多来源之一:

http://lad.dsc.ufcg.edu.br/multimidia/jpegmarker.pdf