Este código funciona principalmente, pero los datos resultantes parecen perder un canal de color (es lo que estoy pensando) ya que los datos de imagen resultantes cuando se muestran son de color azul.Convertir UIImage en CVImageBufferRef
Aquí está el código:
UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
El pixelBufferFromCGIImage método se agarró de otro post sobre StackOverflow aquí: How do I export UIImage array as a movie? (aunque esta aplicación no está relacionada con lo que estoy tratando de hacer) es
+ (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image
{
CGSize frameSize = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image));
NSDictionary *options = @{
(__bridge NSString *)kCVPixelBufferCGImageCompatibilityKey: @(NO),
(__bridge NSString *)kCVPixelBufferCGBitmapContextCompatibilityKey: @(NO)
};
CVPixelBufferRef pixelBuffer;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width,
frameSize.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
&pixelBuffer);
if (status != kCVReturnSuccess) {
return NULL;
}
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
void *data = CVPixelBufferGetBaseAddress(pixelBuffer);
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(data, frameSize.width, frameSize.height,
8, CVPixelBufferGetBytesPerRow(pixelBuffer), rgbColorSpace,
(CGBitmapInfo) kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
CGImageGetHeight(image)), image);
CGColorSpaceRelease(rgbColorSpace);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
return pixelBuffer;
}
Creo que tiene algo que ver con la relación entre kCVPixelFormatType_32ARGB y kCGImageAlphaNoneSkipLast aunque he probado todas las combinaciones y he obtenido el mismo resultado o una falla de la aplicación. Una vez más, esto obtiene los datos de UIImage en CVImageBufferRef, pero cuando visualizo la imagen en la pantalla, parece perder un canal de color y aparece de color azul. La imagen es un png.
Gracias por la respuesta. La solución es que este código funciona perfectamente según lo previsto. El problema estaba en utilizar los datos para crear una textura OpenGL. Completamente no relacionado con este código. ¡Cualquiera que esté buscando cómo convertir UIImage a CVImageBufferRef, su respuesta está en el código de arriba! – Eric
Como referencia: PNG no está necesariamente indexado (como GIF), también admite imágenes RGB sin pérdida de color (obviamente, esto funciona mejor con dibujos de líneas y bloques de colores sólidos) – Ethan