J'essaie d'utiliser l'interface C de CoreGraphics & CoreFoundation pour enregistrer un tampon de données RGBA 32 bits (en tant que void *) dans un fichier PNG. Lorsque je tente de finialize le CGImageDestinationRef
, le message d'erreur suivant est imprimé à la console: Pour autant que je peux direCoreGraphics: Encoder les données RGBA au format PNG
libpng error: No IDATs written into file
, le CGImageRef
j'ajouter à la CGImageDestinationRef
est valide.
code relavent:
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);
}
Ce poste est similaire, sauf que je ne suis pas à l'aide de l'interface Objectif C: Saving a 32 bit RGBA buffer into a .png file (Cocoa OSX)
Merci pour les pointeurs. Je suis toujours à la recherche de ce fichier UTCoreTypes.h qui a la constante kUTTypePNG définie. La documentation dit que c'est dans MobileCoreServices.framework, mais je n'ai pas ce framework dans mon SDK MacOSX10.8. Le problème sous-jacent existe toujours, cependant: je reçois toujours l'erreur «libpng error: No IDAT écrit dans le fichier» après l'application de vos correctifs pour le dictionnaire des options. – Chris
@Chris: MobileCoreServices est pour iOS, qui n'a pas vraiment un framework CoreServices complet comme OS X le fait. Dans OS X, UTCoreTypes.h fera partie de 'LaunchServices.framework », qui est un sous-cadre du framework« CoreServices.framework ». Mis à jour la réponse aussi (ou le sera bientôt). – NSGod
Ugh, n'a pas vu votre propre réponse avant d'écrire le mien. – NSGod