2014-12-10 2 views
2

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

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(), ...); 

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

ответ

3

Простой способ, используя свойство 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.

0

Из вашего фрагмента кода, похоже, вы начинаете с объекта 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); 
Смежные вопросы