Как получить PNG в кодировке base64 из CGImageRef?

у меня есть объект CGImageRef (вар кварцИзображение). Как преобразовать этот объект в формат данных PNG для Интернета: "data:image/png;base64,"+ изображение данных base64

мой код:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer, 0);
    void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGImageRef quartzImage = CGBitmapContextCreateImage(context);
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    NSLog(@"%@",quartzImage);
}

person Seryh    schedule 08.02.2014    source источник


Ответы (1)


Если у вас уже есть CGImageRef (с именем quartzImage в коде), вам не нужно создавать NSImage. Создайте NSBitmapImageRep напрямую. И ни в коем случае нельзя использовать метод lockFocus. Это хорошо для изображений, которые должны отображаться на экране. И поэтому lockFocus обычно создает изображения с разрешением 72 dpi и 144 dpi для экранов Retina. Или вы хотите создавать изображения для Интернета со свойствами вашего экрана? Попробуй это:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:quartzImage];
NSData *repData = [bitmapRep representationUsingType:NSPNGFileType] properties:nil];
NSString *base64String = [repData base64EncodedStringWithOptions:0];

Этот метод base64… недоступен до OS X 10.9. В этом случае вы должны использовать base64Encoding

person Heinrich Giesen    schedule 08.02.2014