Questo codice funziona principalmente, ma i dati risultanti sembrano perdere un canale di colore (è quello che sto pensando) poiché i dati dell'immagine risultanti quando sono visualizzati sono colorati di blu!Converti UIImage in CVImageBufferRef
Ecco il codice:
UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
Il metodo pixelBufferFromCGIImage è stato afferrato da un altro post su StackOverflow qui: How do I export UIImage array as a movie? (anche se questa applicazione non è correlato a quello che sto cercando di fare) è
+ (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;
}
Sto pensando che abbia qualcosa a che fare con la relazione tra kCVPixelFormatType_32ARGB e kCGImageAlphaNoneSkipLast sebbene abbia provato ogni combinazione e abbia ottenuto lo stesso risultato o un crash dell'applicazione. Ancora una volta, questo ottiene i dati UIImage in CVImageBufferRef ma quando visualizzo l'immagine sullo schermo, sembra perdere un canale di colore e si presenta colorato di blu. L'immagine è un png.
Grazie per la risposta. La soluzione è che questo codice funziona perfettamente come previsto. Il problema era nell'usare i dati nella creazione di una trama OpenGL. Completamente estraneo a questo codice. Chiunque cerchi come convertire UIImage in CVImageBufferRef, la tua risposta è nel codice sopra! – Eric
Per riferimento: PNG non è necessariamente indicizzato (come GIF), supporta anche immagini RGB a colori senza perdita (ovviamente funziona meglio con disegni a linee e blocchi a tinta unita) – Ethan