【问题标题】:iOS 14 ARKit CapturedImage JPEG Conversion HEIC WarningiOS 14 ARKit CapturedImage JPEG 转换 HEIC 警告
【发布时间】:2020-10-29 22:41:17
【问题描述】:

TL;DR:iOS14 中的 ARKit capturedImage 发生了一些变化,我们无法使其适应我们的流程。

使用 Xcode 12 GM 构建,在 iPhone 6S 14.0 上测试。

我们已经实现了将ARFrame 转换为Data 的流程,这对于尚未升级到iOS14 的设备非常有效。

我们收到ciImage 喜欢:

extension ARFrame {
    var ciImage: CIImage { CIImage(cvPixelBuffer: capturedImage) }
}

我们输入ImageConverter:

public class ImageConverter {
    lazy var imageContext = CIContext(mtlDevice: MTLCreateSystemDefaultDevice()!)
    lazy var colorSpace = CGColorSpace(name: CGColorSpace.sRGB)

    public func jpgData(for image: CIImage) -> Data {
        guard let colorSpace = colorSpace else { return Data() }

        if let jpegRepresentation = imageContext.jpegRepresentation(of: image,
                                                                    colorSpace: image.colorSpace ?? colorSpace) {
            return jpegRepresentation
        } else {
            return Data()
        }
    }
}

所以,问题是,当我们调用.jpegRepresentation 时,它会发出警告:

findWriterForType:128: unsupported file format 'public.heic'

虽然jpegRepresentation 不是 nil,但它不适用于我们的服务器,它需要 jpeg 数据(仍然适用于 iOS13.7 或更低版本的设备)。

到目前为止我们尝试了什么:

if let heifRepresentation = imageContext.heifRepresentation(of: image,
                                                            format: .RGBA8,
                                                            colorSpace: image.colorSpace ?? colorSpace) {
    return heifRepresentation
}

返回 nil,并使用 .jpegRepresentation 引发相同的错误。也试过其他格式,没用。

【问题讨论】:

标签: ios swift arkit ios14


【解决方案1】:

问题在于使用.jpegRepresentation 创建的JPEG 数据格式。

这是 iPhone XS - iOS13 与 iPhone 6S - iOS14 之间的区别:

终端输出:

➜文件testiOS13.jpeg

testiOS13.jpeg:JPEG图像数据,JFIF 标准 1.01,纵横比,密度 72x72,段长 16,Exif 标准:[TIFF 图像数据,大端,direntries=1],基线, 精度 8、600x800、分量 3

➜ 文件 testiOS14.jpeg

testiOS14.jpeg:JPEG 图像数据,Exif 标准:[TIFF 图像数据, 大端,direntries=5,xresolution=74,yresolution=82, resolutionunit=2],基线,精度 8,412x733,分量 3

iOS 14 ARKit 图片上缺少 JFIF 标准 1.01。

CGImageData 之间有一个圈圈(以及可用性检查,以防 iOS 13.7 或更低版本出现问题):

public func jpgData(for image: CIImage, with size: CGSize) -> Data {
    guard #available(iOS 14.0, *) else { return jpgData(for: image) }

    guard let cgImage = imageContext.createCGImage(image, from: CGRect(origin: .zero, size: size)) else { return jpgData(for: image) }

    let data = NSMutableData()

    guard let imageDestination = CGImageDestinationCreateWithData(data, AVFileType.jpg as CFString, 1, nil) else { return jpgData(for: image) }
    CGImageDestinationAddImage(imageDestination, cgImage, nil)

    guard CGImageDestinationFinalize(imageDestination) else { return jpgData(for: image) }

    return data as Data
}

private func jpgData(for image: CIImage) -> Data {
    guard let colorSpace = colorSpace else { return Data() }

    return imageContext.jpegRepresentation(of: image, colorSpace: colorSpace) ?? Data()
}

最新变化:

终端输出:

➜ 文件 testiOS14_New.jpeg

testiOS14_New.jpeg:JPEG 图像数据,JFIF 标准 1.01,纵横比,密度72x72,段长16,Exif标准:[TIFF图像数据,大端,direntries=1],基线,精度8, 413x734,组件 3

【讨论】:

    【解决方案2】:

    我也注意到了一些奇怪的地方,执行几乎相同的流程,但将 ARFrame 保存为 heic 文件: 在 iOS 14 上,它在某些内部方法中完全崩溃,并使 heifRepresentation 无用。

    下面是处理转换的代码sn-p:

            guard let ciImage = CIImage(image: self),
            let colorSpace = ciImage.colorSpace else {
            throw HEICError.heicNotSupported
        }
        
        let ciContext = CIContext()
    
        do {
            try ciContext.writeHEIFRepresentation(of: ciImage, to: urlFilePath, format: ciContext.workingFormat, colorSpace: colorSpace, options: [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1.0])
        } catch {
            print("Error is \(error.localizedDescription)")
            throw HEICError.saveFail
        }
    

    提醒一下,这在 iOS14 之前完美运行。我尝试了许多编写 heic 文件的方法,但我在以下位置遇到了致命的崩溃:

    vExtractChannel_ARGB8888 BAD_EXEC

    这里肯定有问题。

    有事会更新

    【讨论】:

    • 我偶然发现了与 CIContext 方法 heifRepresentation() 完全相同的问题 (vExtractChannel_ARGB8888 BAD_EXEC)。我刚刚向 Apple 提交了错误报告。其他格式运行良好(jpeg、tiff),只是 heif 崩溃。
    猜你喜欢
    • 2021-03-10
    • 2018-05-05
    • 2022-01-10
    • 2018-01-11
    • 2021-05-17
    • 2019-11-18
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多