gpt4 book ai didi

iOS 14 ARKit CapturedImage JPEG 转换 HEIC 警告

转载 作者:行者123 更新时间:2023-12-05 06:11:22 27 4
gpt4 key购买 nike

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

Built with Xcode 12 GM, tested on 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 相同的错误。也尝试了其他格式,无济于事。

最佳答案

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

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

终端输出:

➜ file testiOS13.jpeg

testiOS13.jpeg: JPEG image data, JFIFstandard 1.01, aspect ratio, density 72x72, segment length 16, ExifStandard: [TIFF image data, big-endian, direntries=1], baseline,precision 8, 600x800, components 3

➜ file testiOS14.jpeg

testiOS14.jpeg: JPEG image data, Exif standard: [TIFF image data,big-endian, direntries=5, xresolution=74, yresolution=82,resolutionunit=2], baseline, precision 8, 412x733, components 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 image data, JFIF standard1.01, aspect ratio, density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=1], baseline, precision 8,413x734, components 3

关于iOS 14 ARKit CapturedImage JPEG 转换 HEIC 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64028027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com