2010-02-17 8 views
4

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

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

ответ

5

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.

+1

Это работало отлично, но, к сожалению, метод presentationUsingType: не поддерживается кокотроном, и мне также нужно иметь возможность нацеливать кокотрон. Можете ли вы предложить другие способы достижения этого? – Mike2012

+0

@ Майкл, отредактированный ответ, чтобы включить библиотеку C, которая поможет вам. –

2

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

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

+0

Благодарим вас за предложение, но похоже, что CGImageCreate не поддерживается clozure (это общий мост lisp - какао), можете ли вы предложить любые другие альтернативы вашему методу и тому, который указан выше. Спасибо за вашу помощь! – Mike2012