CGImageDestinationAddImageFromSource causes issues in iOS 18 / macOS 15

There seems to be an issue in iOS 18 / macOS 15 related to image thumbnail generation and/or HEIC.

We are transcoding JPEG images to HEIC when they are loaded into our app (HEIC has a much lower memory footprint when loaded by Core Image, for some reason). We use Image I/O for that:

guard let source = CGImageSourceCreateWithURL(inputURL, nil),
      let destination = CGImageDestinationCreateWithURL(outputURL, UTType.heic.identifier as CFString, 1, nil) else {
    throw <error>
}
let primaryImageIndex = CGImageSourceGetPrimaryImageIndex(source)
CGImageDestinationAddImageFromSource(destination, source, primaryImageIndex, nil)

When we use CGImageDestinationAddImageFromSource, we get the following warnings on the console:

createImage:1445: *** ERROR: bad image size (0 x 0) rb: 0
CGImageSourceCreateThumbnailAtIndex:5195: *** ERROR: CGImageSourceCreateThumbnailAtIndex[0] - 'HJPG' - failed to create thumbnail [-67] {alw:-1, abs: 1 tra:-1 max:4620}
writeImageAtIndex:1025: ⭕️ ERROR: '<app>' is trying to save an opaque image (4620x3466) with 'AlphaPremulLast'. This would unnecessarily increase the file size and will double (!!!) the required memory when decoding the image --> ignoring alpha.

It seems that CGImageDestinationAddImageFromSource is trying to extract/create a thumbnail, which fails somehow.

I re-wrote the last part like this:

guard let primaryImage = CGImageSourceCreateImageAtIndex(source, primaryImageIndex, nil),
      let properties = CGImageSourceCopyPropertiesAtIndex(source, primaryImageIndex, nil) else {
    throw <error>
}
CGImageDestinationAddImage(destination, primaryImage, properties)

This doesn't cause any warnings.

An issue that might be related has been reported here. I've also heard from others having issues with CGImageSourceCreateThumbnailAtIndex.

CGImageDestinationAddImageFromSource causes issues in iOS 18 / macOS 15
 
 
Q