我正在尝试使用 CoreGraphics & CoreFoundation 的 C 接口将 32 位 RGBA 数据的缓冲区(作为 void*)保存到 PNG 文件中。当我尝试完成时CGImageDestinationRef,控制台会打印以下错误消息:
libpng error: No IDATs written into file
据我所知,CGImageRef我添加到的CGImageDestinationRef是有效的。
相关代码:
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);
}
这篇文章很相似,除了我没有使用 Objective C 接口: 将 32 位 RGBA 缓冲区保存到 .png 文件中(Cocoa OSX)