iOS 14 ARKit捕获图像JPEG转换HEIC警告

3
TL;DR: ARKit中iOS14版本的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相同的错误。也尝试了其他格式,但均失败。


我遇到了相同的错误。在这里也发了一篇帖子: https://stackoverflow.com/questions/64216068/heic-encoding-of-ciimage-failing-with-ios14 - Adeel Abbas
https://stackoverflow.com/questions/64216068/heic-encoding-of-ciimage-failing-with-ios14 - Adeel Abbas
1个回答

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

以下是iPhone XS - iOS13和iPhone 6S - iOS14之间的区别:

终端输出:

➜ file testiOS13.jpeg

testiOS13.jpeg:JPEG图像数据,JFIF标准1.01,宽高比,密度72x72,段长度16,Exif标准:[TIFF图像数据,大端,直接入口=1],基线,精度8,600x800,组件3

➜ file testiOS14.jpeg

testiOS14.jpeg:JPEG图像数据,Exif标准:[TIFF图像数据,大端,直接入口=5,x分辨率=74,y分辨率=82,分辨率单位=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()
}

最新更改如下:

终端输出:

➜ file testiOS14_New.jpeg

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


我相信UIImage的jpgData本身有问题。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接