Как создать CGImageRef из NSBitmapImageRep?

Как я могу создать CGImageRef из NSBitmapImageRep? Или как я могу определить совершенно новый CGImageRef так же, как NSBitmapImageRep? Определение NSBitmapImageRep работает отлично. Но мне нужно изображение как CGImageRef,

unsigned char *plane = (unsigned char *)[data bytes]; // data = 3 bytes for each RGB pixel

NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc]
                              initWithBitmapDataPlanes:     &plane
                              pixelsWide:                   width
                              pixelsHigh:                   height
                              bitsPerSample:                depth
                              samplesPerPixel:              channel
                              hasAlpha: NO
                              isPlanar: NO
                              colorSpaceName: NSCalibratedRGBColorSpace
                              //bitmapFormat: NSAlphaFirstBitmapFormat
                              bytesPerRow:                  channel * width
                              bitsPerPixel:                 channel * depth
                             ];

Я понятия не имею, как создать CGImageRef от NSBitmapImageRep или как определить новый CGImageRef:

CGImageRef imageRef = CGImageCreate(width, height, depth, channel*depth, channel*width, CGColorSpaceCreateDeviceRGB(), ... );

Пожалуйста, кто-нибудь может дать мне подсказку?

2 ответа

Решение

Самый простой способ - с помощью CGImage свойство (введено в 10.5):

CGImageRef image = imageRep.CGImage;

Документация:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBitmapImageRep_Class/index.html

Возвращаемое значение

Возвращает автоматически освобожденный непрозрачный тип CGImageRef на основе текущих данных растрового изображения получателя.

обсуждение

Возвращенный CGImageRef имеет размеры в пикселях, которые идентичны размерам получателя. Этот метод может вернуть ранее существующий непрозрачный тип CGImageRef или создать новый. Если получатель позднее изменяется, последующие вызовы этого метода могут возвращать различные непрозрачные типы CGImageRef.

Судя по фрагменту кода, вы начинаете с NSData объект. Итак, ваш вопрос, кажется, как создать CGImage из объекта данных. В этом случае нет причин проходить NSBitmapImageRep,

Вы были почти там с призывом CGImageCreate(), Вам просто нужно выяснить, как поставить CGDataProvider к этому. Вы можете создать CGDataProvider из NSData довольно прямо, как только вы поймете, что NSData бесплатно соединяется с CFData, Так:

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGImageRef image = CGImageCreate(width, height, depth / 3, depth, channel*width, colorspace, kCGImageAlphaNone, provider, NULL, TRUE, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorspace);
Другие вопросы по тегам