2010-02-17 3 views
4

Je dois enregistrer le contenu d'une application de traitement de pixels dans un fichier .png, mais je n'arrive pas à trouver le meilleur moyen d'y parvenir. Les données de pixel sont stockées dans un tampon RGBA 32 bits. Quelqu'un peut-il suggérer de bons outils que je pourrais utiliser pour accomplir cela? Malheureusement, CGImage et representationUsingType: ne sont pas supportés par cocotron et je dois aussi pouvoir cibler mon application pour la publication sur PC. Quelqu'un peut-il suggérer une troisième façon d'accomplir cette tâche?Enregistrement d'un tampon RGBA 32 bits dans un fichier .png (Cocoa OSX)

Répondre

5

NSBitmapImageRep devrait vous apporter ce dont vous avez besoin. Chargez les données dans le NSBitmapImageRep puis utilisez representationUsingType:properties: pour le sortir en tant que PNG. Un exemple rapide:

NSBitmapImageRep *imageRep = 
    [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:imageBuffer 
              pixelsWide:imageWidth 
              pixelsHigh:imageHeight 
             bitsPerSample:8 
             samplesPerPixel:4 
               hasAlpha:YES 
               isPlanar:NO 
             colorSpaceName:NSDeviceRGBColorSpace 
              bitmapFormat:NSAlphaFirstBitmapFormat 
              bytesPerRow:imageWidth * 4 
              bitsPerPixel:32]; 
NSData *pngData = [imageRep representationUsingType:NSPNGFileType 
             properties:propertyDictionary]; 

Si vous ne pouvez pas utiliser ces méthodes de cacao, consultez libpng.

+1

Cela a fonctionné très bien mais malheureusement la méthode representationUsingType: n'est pas supportée par le cocotron, et je dois aussi pouvoir cibler le cocotron. Pouvez-vous suggérer d'autres façons d'accomplir cela? – Mike2012

+0

@Michael, réponse éditée pour inclure une bibliothèque C qui vous aidera. –

2

Créez un CGImage à partir des données de pixel et alimentez-le à CGImageDestination. Ne pas oublier de finalize the destination avant de le relâcher.

Cette étape est obligatoire et très facile à oublier.

+0

Nous vous remercions de votre suggestion, mais il semble que CGImageCreate n'est pas supporté par clozure (il s'agit d'un lisp commun - cocoa bridge) pouvez-vous suggérer d'autres alternatives à votre méthode et celle listée ci-dessus. Merci pour votre aide! – Mike2012

Questions connexes