Convertir UIImage à CVImageBufferRef
Ce code fonctionne majoritairement, mais les données qui en résulte semble perdre un canal de couleur (est ce que je pense) que les données d'image lors de l'affichage est teintée en bleu!
Voici le code:
UIImage* myImage=[UIImage imageNamed:@"sample1.png"];
CGImageRef imageRef=[myImage CGImage];
CVImageBufferRef pixelBuffer = [self pixelBufferFromCGImage:imageRef];
La méthode pixelBufferFromCGIImage a été saisi à partir d'un autre poste sur stackoverflow ici: Comment puis-je exporter UIImage tableau comme un film? (bien que cette application est sans rapport avec ce que je suis en train de faire), il est
+ (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;
}
Je pense qu'il a quelque chose à voir avec la relation entre kCVPixelFormatType_32ARGB et kCGImageAlphaNoneSkipLast si j'ai essayé toutes les combinaisons et d'obtenir le même résultat ou d'un plantage de l'application. Encore une fois, cela devient à la UIImage données dans CVImageBufferRef mais quand j'affiche l'image sur l'écran, il semble qu'il lâche un canal de couleur et se montre teintée en bleu. L'image est au format png.
OriginalL'auteur Eric | 2011-11-15
Vous devez vous connecter pour publier un commentaire.
Il sonne comme il pourrait être cette relation. Peut-être ont-il un jpg et RGB au lieu de couleurs indexées avec un png?
Pour référence: PNG n'est pas nécessairement indexés (comme le format GIF), il prend également en charge sans perte de plein-couleur des images RVB (évidemment, cela fonctionne mieux avec des dessins et des solides blocs de couleur)
OriginalL'auteur Nathan M Rose
La solution, c'est que ce code fonctionne parfaitement comme prévu. 🙂 Le problème a été en utilisant les données de la création d'une texture OpenGL. Complètement sans rapport avec le présent code. Toute personne à la recherche pour comment Convertir une UIImage à CVImageBufferRef, votre réponse est dans le code ci-dessus!
kCVPixelFormatType_32BGRA
, et l'utilisation(CGBitmapInfo) kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst
comme la dernière variable de lacontext
. Qui plus est, laNSDictionary *options
sont inutiles OMIOriginalL'auteur Eric
Si quelqu'un est toujours à la recherche d'une solution à ce problème, je l'ai résolu en changeant les Booléens dans la pixelBuffer options:
De NON à OUI:
OriginalL'auteur Rob Caraway
Je rencontre le même problème et trouver quelques échantillons: http://www.cakesolutions.net/teamblogs/2014/03/08/cmsamplebufferref-from-cgimageref
essayez de changer
OriginalL'auteur JoShin
Voici ce qui fonctionne vraiment:
Vous pouvez modifier le nombre de pixels mémoire tampon à une UIImage (et puis de les afficher ou enregistrer) pour confirmer qu'il fonctionne avec cette méthode:
OriginalL'auteur Maxi Mus
Juste pour clarifier la réponse ci-dessus: j'ai couru dans la même question, parce que mon code du shader m'attendais à deux couches d'échantillons dans un buffer d'image, alors que je l'ai utilisé une seule couche tampon
Cette ligne a pris les valeurs rvb à partir d'un échantillon et les a transmises à (je ne sais pas quoi), mais le résultat final est plein de couleur de l'image.
OriginalL'auteur Alex Stone