Sono, lo sviluppo di un'applicazione iOS che utilizza alcune funzionalità OpenCV (rimuovere lo sfondo, i rilevamenti dei bordi ecc)OpenCV ios un'immagine trasparente caricata senza trasparenza
Tra le altre cose, mi carico immagini trasparenti (PNG). Per qualche motivo, quando carico le immagini, opencv decide di ignorare alcune aree trasparenti nel rispetto degli altri. Posso vedere questo convertendo il mio UIImage semi trasparente in un IplImage e poi di nuovo in UIImage (senza fare alcuna operazione sull'iplimage) e salvando entrambe le immagini nel file locale.
Questo è il codice che sto utilizzando per la conversione l'UIImage a un IplImage e indietro:
- (IplImage *)CreateIplImageFromUIImageWithTransparency:(UIImage *)image {
// Getting CGImage from UIImage
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// Creating temporal IplImage for drawing
IplImage *iplimage = cvCreateImage(
cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
);
// Creating CGContext for temporal IplImage
CGContextRef contextRef = CGBitmapContextCreate(
iplimage->imageData, iplimage->width, iplimage->height,
iplimage->depth, iplimage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
);
// Drawing CGImage to CGContext
CGContextDrawImage(
contextRef,
CGRectMake(0, 0, image.size.width, image.size.height),
imageRef
);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
// Creating result IplImage
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 4);
cvCvtColor(iplimage, ret, CV_RGBA2BGRA);
cvReleaseImage(&iplimage);
return ret;
}
- (UIImage *)UIImageFromIplImage:(IplImage *)image {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGImageRef imageRef = CGImageCreate(image->width, image->height,
image->depth, image->depth * image->nChannels, image->widthStep,
colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaLast ,
provider, NULL, false, kCGRenderingIntentDefault);
UIImage *ret = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return ret;
}
cosa potrebbe causare questo comportamento?
Grazie
Non posso, questo non è un file salvato sulla directory locale. Piuttosto è salvato nella memoria del programma. Salvare l'immagine in un file e caricarla di nuovo sarà molto inefficiente (e io ho bisogno di un certo livello di efficienza in questo metodo). – vondip
Hum ... Mi dispiace, non ho prestato attenzione, forse dovresti dare un'occhiata a questo: http://stackoverflow.com/questions/6861891/how-do-you-generate-an-rgba-image -in-core-graphics – Poko
Sì, se si nota nel mio CreateIplImageFromUIImageWithTransparency, chiamo kCGImageAlphaPremultipliedLast come consigliato in questa domanda – vondip