I am trying to use the C interface of CoreGraphics & CoreFoundation to save a buffer of 32-bit RGBA data (as a void*) to a PNG file.  When I try to finialize the CGImageDestinationRef, the following error message is printed to the console:
libpng error: No IDATs written into file
As far as I can tell, the CGImageRef I'm adding to the CGImageDestinationRef is valid.
Relavent Code:
void saveImage(const char* szImage, void* data, size_t dataSize, size_t width, size_t height)
{
    CFStringRef name = CFStringCreateWithCString(NULL, szImage, kCFStringEncodingASCII);
    CFURLRef texture_url = CFURLCreateWithFileSystemPath(
                                                     NULL,
                                                     name,
                                                     kCFURLPOSIXPathStyle,
                                                     false);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, data, dataSize, NULL);
    CGImageRef image = CGImageCreate(width, height, 8, 32, 32 * width, colorSpace,
                                 kCGImageAlphaLast | kCGBitmapByteOrderDefault, dataProvider,
                                 NULL, FALSE, kCGRenderingIntentDefault);
    // From Image I/O Programming Guide, "Working with Image Destinations"
    float compression = 1.0; // Lossless compression if available.
    int orientation = 4; // Origin is at bottom, left.
    CFStringRef myKeys[3];
    CFTypeRef   myValues[3];
    CFDictionaryRef myOptions = NULL;
    myKeys[0] = kCGImagePropertyOrientation;
    myValues[0] = CFNumberCreate(NULL, kCFNumberIntType, &orientation);
    myKeys[1] = kCGImagePropertyHasAlpha;
    myValues[1] = kCFBooleanTrue;
    myKeys[2] = kCGImageDestinationLossyCompressionQuality;
    myValues[2] = CFNumberCreate(NULL, kCFNumberFloatType, &compression);
    myOptions = CFDictionaryCreate( NULL, (const void **)myKeys, (const void **)myValues, 3,
                               &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFStringRef type = CFStringCreateWithCString(NULL, "public.png", kCFStringEncodingASCII);
    CGImageDestinationRef dest = CGImageDestinationCreateWithURL(texture_url, type, 1, myOptions);
    CGImageDestinationAddImage(dest, image, NULL);
    if (!CGImageDestinationFinalize(dest))
    {
        // ERROR!
    }
    CFRelease(image);
    CFRelease(colorSpace);
    CFRelease(dataProvider);
    CFRelease(dest);
    CFRelease(texture_url);
}
This post is similar, except I'm not using the Objective C interface: Saving a 32 bit RGBA buffer into a .png file (Cocoa OSX)