Сохранение 32-битного RGBA-буфера в файл .png (Cocoa OSX) - PullRequest
4 голосов
/ 17 февраля 2010

Мне нужно сохранить содержимое приложения-редактора пикселей в файл .png, но у меня возникают проблемы с поиском наилучшего способа сделать это. Данные пикселей хранятся в 32-битном буфере RGBA. Кто-нибудь может предложить какие-нибудь хорошие инструменты, которые я мог бы использовать для достижения этой цели?

EDIT: К сожалению, CGImage и presentationUsingType: не поддерживаются Cocotron, и мне нужно иметь возможность ориентировать свое приложение на выпуск ПК, может кто-нибудь предложить третий способ решения этой задачи?

Ответы [ 2 ]

5 голосов
/ 17 февраля 2010

NSBitmapImageRep должен получить то, что вам нужно. Загрузите данные в NSBitmapImageRep а затем используйте representationUsingType:properties:, чтобы получить его как PNG. Быстрый пример:

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];

Если вы не можете использовать эти методы Какао, проверьте libpng.

2 голосов
/ 17 февраля 2010

Создать CGImage из данных пикселей и передать его в CGImageDestination .

Не забудьте завершить пункт назначения перед его освобождением. Этот шаг является обязательным, и его очень легко забыть.

...