Как создать 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(), ... );

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


person 3ef9g    schedule 10.12.2014    source источник


Ответы (2)


Самый простой способ — использовать свойство CGImage (появившееся в версии 10.5):

CGImageRef image = imageRep.CGImage;

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

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBitmapImageRep_Class/index.html#//apple_ref/occ/instm/NSBitmapImageRep/CGImage

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

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

Обсуждение

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

person justin    schedule 10.12.2014

Из вашего фрагмента кода кажется, что вы начинаете с объекта 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);
person Ken Thomases    schedule 10.12.2014