Lossy option has no effect when exporting PNG to HEIF

Under Sonoma 14.4 the compression option doesn't work with PNG images. It works for JPG/HEIF. Preview can export PNG file to HEIC with compression option. What am I missing? Previously this has worked. I am trying with 0.01 and 0.9 as compression quality and the file size is the same for PNG.

Is Preview using some trick to convert the image using ciContext.createCGImage?

PS: Compression option of 1.0 was broken under 14.4 RC and Preview created empty file.

func heifImageDataUsingDestination(at url: URL, compressionQuality : CGFloat) -> Data?  {
    
    guard let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil) else { return nil }
    guard let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) else { return nil }
    var mutableData = NSMutableData()
    guard let imageDestination = CGImageDestinationCreateWithData(mutableData, "public.heic" as CFString, 1, nil) else { return nil }
    let options = [ kCGImageDestinationLossyCompressionQuality: compressionQuality ] as CFDictionary
    CGImageDestinationAddImage(imageDestination, cgImage, options)
    let success = CGImageDestinationFinalize(imageDestination)
    if success {
        return mutableData as Data
    }
    return nil
}
func heifImageDataUsingCIContext(at url: URL, compressionQuality : CGFloat) -> Data?  {
    
    guard let ciImage = CIImage(contentsOf: url) else { return nil }
    let context = CIContext()
    let colorspace = ciImage.colorSpace ?? CGColorSpaceCreateDeviceRGB()
    let options = [CIImageRepresentationOption(rawValue: kCGImageDestinationLossyCompressionQuality as String) : compressionQuality]
    return context.heifRepresentation(of: ciImage, format: .RGBA8, colorSpace: colorspace, options: options)
}

Same issue is observed with TIFF

I can confirm the issue (tested the Core Image API).

Interestingly, the heif10Representation(...) API still works as expected.

Same behaviour on 14.4.1. Not fixed.

Fixed in 14.5. However something has changed internally. Count of data bytes when compressing image with 0.1 compression factor:

14.5: 37393
14.4.1: 399845
14.2: 36408
12.7.4: 36409

The API still fails for CMYK jpg when the compression value is 1.0 (14.5). CIContext can only work with RGB -> it doesn't fail.

heifImageDataUsingCIContext(at: url, compressionQuality: 0.99) // 648046 bytes
heifImageDataUsingCIContext(at: url, compressionQuality: 1.0) // 1058444 bytes

heifImageDataUsingDestination(at: url, compressionQuality: 0.99) // 645421 bytes
heifImageDataUsingDestination(at: url, compressionQuality: 1.0) // nil
Lossy option has no effect when exporting PNG to HEIF
 
 
Q